Laravel whereHas 多对多关系

Est*_*ern 5 php many-to-many relationships laravel eloquent

我有两个具有多对多关系的主表和一个数据透视表。

模型“类型”

    public function attributes()
    {
        return $this->belongsToMany('App\Attribute', 'attribute_type');
    }
Run Code Online (Sandbox Code Playgroud)

模型“属性”

    public function types()
    {
        return $this->belongsToMany('App\Type', 'attribute_type');
    }
Run Code Online (Sandbox Code Playgroud)

数据透视表“attribute_type”

    Schema::create('attribute_type', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('type_id')->unsigned();
        $table->foreign('type_id')->references('id')->on('types');
        $table->integer('attribute_id')->unsigned();
        $table->foreign('attribute_id')->references('id')->on('attributes');
    });
Run Code Online (Sandbox Code Playgroud)

我想以随机顺序显示 5 个属于 id < 10 类型的属性。

$attributes = Attribute::whereHas('types', function ($query) {
            $query->where('id', '<', '10');
        })->orderByRaw("RAND()")->limit(5);
Run Code Online (Sandbox Code Playgroud)

例如

$attribute->id
Run Code Online (Sandbox Code Playgroud)

给我“未定义的属性:Illuminate\Database\Eloquent\Builder::$id”

Fil*_*ski 7

您所要做的就是执行查询并使用如下get()方法获取集合:

$attributes = Attribute::whereHas('types', function ($query) {
        $query->where('id', '<', '10');
    })->orderByRaw("RAND()")->limit(5)
    ->get();
Run Code Online (Sandbox Code Playgroud)

现在,您正在尝试遍历查询构建器,该查询构建器为您提供另一个查询构建器 $attribute


小智 5

您有 2 个选择:

$attributes = Attribute::whereHas('types', function ($query) {
            $query->where('types.id', '<', '10');
        })->orderByRaw("RAND()")->limit(5);
Run Code Online (Sandbox Code Playgroud)

或者

$attributes = Attribute::whereHas('types', function ($query) {
            $query->where('attribute_type.type_id', '<', '10');
        })->orderByRaw("RAND()")->limit(5);
Run Code Online (Sandbox Code Playgroud)