【问题标题】:Laravel many to many filterLaravel 多对多过滤器
【发布时间】:2016-01-22 01:21:05
【问题描述】:

在多对多关系中,找到属于一个元素的所有元素是非常困难的。但我不知道如何过滤多个。让我解释。 假设我们有一个标准的 Post 和 Tag 模型。他们是多对多的关系。要查找帖子的所有标签,我们会这样做:

Post::find(1)->tags()->get();

为了获得某个标签的所有帖子,我们会这样做

Tag::find(1)->posts()->get();

我想不通的是搜索所有包含 2、3 等标签的帖子。例如,如何找到所有带有标签“it”和“smartphone”的帖子,而不是只有“it”或只有“smartphone”的帖子。

我尝试了 whereHas,但它会返回和 OR'ed 类似 'it' 的帖子 || '手机'。我正在寻找的是 AND'ing 像 'it' && 'smartphone'。

【问题讨论】:

    标签: laravel search filter many-to-many


    【解决方案1】:

    您可能想使用has() 方法。

    例如,要查找只有 2 个标签的帖子并立即加载标签,请执行以下操作...

    Post::with('tags')->has('tags', '=', 2)->get()
    

    http://laravel.com/api/5.0/Illuminate/Database/Eloquent/Builder.html#method_has

    如果您需要查找某个帖子的某个名称的所有标签,您可以使用whereHas()

    例如,如果您需要一个带有“it”和“smartphone”标签的帖子,您可以执行以下操作...

    $tags = ['it', 'smartphone'];
    
    Post::with('tags')->whereHas('tags', function($q) use ($tags) {
        $q->whereIn('name', $tags);
    })->get();
    

    您还可以将其他参数传递给whereHas 函数,因此如果您只想要只有您要查找的标签且没有其他标签的帖子,您可以执行以下操作...

    $tags = ['it', 'smartphone'];
    
    Post::with('tags')->whereHas('tags', function($q) use ($tags) {
        $q->whereIn('name', $tags);
    }, '=', count($tags))->get();
    

    这假设您的数据透视表管理良好。如果您有默认值(一篇文章多次具有相同的标签),这将不起作用。我建议在包含 2 个外键的数据透视表上使用复合主键。

    http://laravel.com/api/5.0/Illuminate/Database/Eloquent/Builder.html#method_whereHas

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-28
      • 1970-01-01
      • 2015-03-25
      • 2011-01-14
      • 2014-01-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多