Laravel 5 / Eloquent - 对属于多的关系进行查询过滤

Posted

技术标签:

【中文标题】Laravel 5 / Eloquent - 对属于多的关系进行查询过滤【英文标题】:Laravel 5 / Eloquent - query filtering on belongs-to-many relation 【发布时间】:2021-02-24 10:06:12 【问题描述】:

假设我的数据库中有这些关系:

产品

标识 |名字

类别

标识 |名字

产品类别

标识 |产品编号 | category_id


我可以使用 Eloquent 的模型使用“belongsToMany”关系轻松构建它: Product 有一个名为“categories”的“categories”公共函数,Category 有一个“products”公共函数。

现在,我有一个页面,用户希望通过单击类别名称来过滤给定类别的所有产品。

程序会将 category_id 传递给我的控制器,现在开始解决问题。

我可以轻松地“手动”编写此代码:

            $products = Product::query()
            ->leftJoin('product_category', 'product.id', '=', 'product_category.product_id')
            ->leftJoin('category', 'product_category.category_id', '=', 'category.id')
            ->where('category_id', '=', 2);

但这会使在 Model 类中定义关系的过程几乎毫无用处。

有没有更好的方法,也许使用 ORM 的东西?

非常感谢!

【问题讨论】:

【参考方案1】:

使用whereHas:

$products = Product::whereHas('categories', function ($q) 
    $q->where('id', request()->input('category_id'));
)->get();

见Querying Relationship Existence。

【讨论】:

它就像一个魅力!谢谢!我唯一需要解决的是 where 列的名称,因为 id 是“不明确的”。我必须明确告诉他使用 category_id。

以上是关于Laravel 5 / Eloquent - 对属于多的关系进行查询过滤的主要内容,如果未能解决你的问题,请参考以下文章

php Laravel 5 Eloquent CheatSheet #laravel #eloquent

使用 Laravel 5.5 接收 [Illuminate\Database\Eloquent\MassAssignmentException] 电子邮件

Laravel 5 - 使用 Mockery 模拟 Eloquent 模型

5 个 Laravel Eloquent 小技巧

Laravel 5:如何使用 'where' 或 'orderBy' 使用 eloquent?

Laravel 5.0 用户 Eloquent 模型嘲讽