WhereIn 和关系

问题描述 投票:0回答:3

我有3张桌子:

  • 文章
  • 标签
  • 文章标签

它们都是具有枢轴的多对多关系。

我需要查询它以获取具有标签数组的所有文章:

Article::with('tags')->whereIn('id', $tagIdArray)->get();

上面的问题是它返回 id 为 $tagIdArray 的文章。如何限制结果以便在标签关系上使用 whereIn?

php laravel eloquent
3个回答
9
投票

你的想法是正确的,但有点偏离主题。使用

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


2
投票

这就是我通过在模型关系级别过滤数据来拉取产品的方法。

$youMayAlsoLike  = Category::whereHas('product', function($query)
   {
      $query->whereIn('category_slug', ['gift-sets','multi-shade-sticks','eye pencil']);
   })
   ->inRandomOrder()
   ->take(10)
   ->get();

0
投票

使用查询生成器时,您可以执行类似的操作,但形式略有不同。对我来说,当我阅读这些答案时,这一点并不明显,而且我认为官方文档也不够清晰,所以我想我将其包含在这里以帮助那些追随我的人。

如果关系存在检查是更大更复杂查询的一部分,这会很有帮助。

$query = Article::query();
$query->whereHas('tags', function (Builder $builder) use ($tagIdArray) {
                $builder->whereIn('id', $tagIdArray);
});
$results = $query->get();
© www.soinside.com 2019 - 2024. All rights reserved.