我有3张桌子:
它们都是具有枢轴的多对多关系。
我需要查询它以获取具有标签数组的所有文章:
Article::with('tags')->whereIn('id', $tagIdArray)->get();
上面的问题是它返回 id 为 $tagIdArray 的文章。如何限制结果以便在标签关系上使用 whereIn?
你的想法是正确的,但有点偏离主题。使用
with('tags')
函数只需将您的文章与相关标签一起拉出,在 with()
函数之后链接的查询仍然适用于文章模型。
要查询关系,您可以执行以下操作
$tagIdArray = [1, 3, 5, 7, 9];
$articles = Article::whereHas('tags', function($query) use ($tagIdArray) {
/**
* Now querying the Tags relation. So anything in this closure will query the Tags
* relation, but outside of the closure, you're back to querying the Articles.
*/
$query->whereIn('id', $tagIdArray);
})->get();
这是有关查询关系的 Laravel 文档 http://laravel.com/docs/4.2/eloquent#querying-relations
这就是我通过在模型关系级别过滤数据来拉取产品的方法。
$youMayAlsoLike = Category::whereHas('product', function($query)
{
$query->whereIn('category_slug', ['gift-sets','multi-shade-sticks','eye pencil']);
})
->inRandomOrder()
->take(10)
->get();
使用查询生成器时,您可以执行类似的操作,但形式略有不同。对我来说,当我阅读这些答案时,这一点并不明显,而且我认为官方文档也不够清晰,所以我想我将其包含在这里以帮助那些追随我的人。
如果关系存在检查是更大更复杂查询的一部分,这会很有帮助。
$query = Article::query();
$query->whereHas('tags', function (Builder $builder) use ($tagIdArray) {
$builder->whereIn('id', $tagIdArray);
});
$results = $query->get();