在laravel中的两个相关模型中过滤
Posted
技术标签:
【中文标题】在laravel中的两个相关模型中过滤【英文标题】:Filter in two related model in laravel 【发布时间】:2021-09-04 19:48:17 【问题描述】:我有两个模型,分别命名为 Product
和 Category
。在产品表中,我将 category_id 作为类别的外键。两个表都有title
列。我想搜索标题,当它与类别表相关时,该类别的所有产品都会出现在结果中,但是当它与产品表相关时,只有那些与查询相关的产品才会出现。
我试过了:
$query = Category::with('products')->select(['products.*']);
if($request->get('q'))
$query->where(function($query1) use ($request)
$query1->where('categories.title', 'like', '%'.$request->get('q').'%')
->orWhere('products.title', 'like', '%'.$request->get('q').'%');
);
【问题讨论】:
【参考方案1】:我认为你可以不用左连接
$result=Category::when($request->get('q'),function ($query)use($request)
$query->where('title', 'like', '%'.$request->get('q').'%');
)
->when($request->get('q'),function ($query)use($request)
$query->orWhereHas('categories',function ($q)use($request)
$q->where('title', 'like', '%'.$request->get('q').'%');
);
)->get();
【讨论】:
【参考方案2】:感谢家伙的努力,但我使用加入解决了这个问题。对于发现此解决方案有帮助的其他人,我不会删除此问题。 所以这是我尝试过的代码。
$query = Product::leftJoin('categories',function($join)
$join->on('products.category_id','=','categories.id');
)->select(['products.*']);
if($request->get('q'))
$query->where(function($query1) use ($request)
$query1->where('categories.title', 'like', '%'.$request->get('q').'%')
->orWhere('products.title', 'like', '%'.$request->get('q').'%');
);
$query->get();
【讨论】:
【参考方案3】:您可以同时搜索这两个标题,当它与类别表相关时,该类别的所有产品将如下所示:
SELECT `title` FROM `PRODUCTS` WHERE `product`.`category_id` = some id ;
在laravel中代表产品型号:
Product::select('title')->where(['category_id', 1 ])->get();
如果您想搜索类别然后代表该类别的产品,您可以这样做:
$categoryData = Category::select('id')->where(['title', 'LIKE', '%abc%'])->get();
$productData = Product::select('title')->where(['category_id', $categoryData->id ])->get();
【讨论】:
以上是关于在laravel中的两个相关模型中过滤的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 中自动删除相关行(Eloquent ORM)
Laravel - 按“字段及其关系模型字段”之间的条件过滤模型
如何通过多对多关系获取与同一张表相关的行 - Laravel