Laravel whereHas on Many-to-Many 关系

Posted

技术标签:

【中文标题】Laravel whereHas on Many-to-Many 关系【英文标题】:Laravel whereHas on Many-to-Many relationships 【发布时间】:2016-09-05 23:46:48 【问题描述】:

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

模型“类型”

    public function attributes()
    
        return $this->belongsToMany('App\Attribute', 'attribute_type');
    

模型'属性'

    public function types()
    
        return $this->belongsToMany('App\Type', 'attribute_type');
    

数据透视表'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');
    );

我想以随机顺序显示 5 个属于 id

$attributes = Attribute::whereHas('types', function ($query) 
            $query->where('id', '<', '10');
        )->orderByRaw("RAND()")->limit(5);

例如

$attribute->id

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

【问题讨论】:

【参考方案1】:

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

$attributes = Attribute::whereHas('types', function ($query) 
        $query->where('id', '<', '10');
    )->orderByRaw("RAND()")->limit(5)
    ->get();

现在您正在尝试迭代查询构建器,它会为您提供另一个查询构建器,因为 $attribute

【讨论】:

我也改变了 where('id', ' 【参考方案2】:

你有两个选择:

$attributes = Attribute::whereHas('types', function ($query) 
            $query->where('types.id', '<', '10');
        )->orderByRaw("RAND()")->limit(5);

$attributes = Attribute::whereHas('types', function ($query) 
            $query->where('attribute_type.type_id', '<', '10');
        )->orderByRaw("RAND()")->limit(5);

【讨论】:

虽然这可能会回答问题,但如果可能的话,您应该 edit 您的回答包含对如何这些陈述中的每一个回答问题的简短说明。这有助于提供上下文,并使您的答案对未来的读者更有用。

以上是关于Laravel whereHas on Many-to-Many 关系的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 递归 whereHas on BelongsToMany 关系

Laravel eloquent apply whereHas on the latest record of hasMany 关系

Laravel 多对多使用WhereHas搜索,中间表和要搜索表的字段重合时

Laravel 多对多使用WhereHas搜索,中间表和要搜索表的字段重合时

Laravel (5.7) Eloquent Many to Many with query on双方

从 Laravel 5.1 升级到 Laravel 5.8 后 whereHas() 变慢