如何搜索属于laravel中的标签的所有文章

时间:2016-12-29 02:32:53

标签: mysql laravel laravel-5 laravel-5.3

文章模型

class Article {
    public function Tag(){
      return $this->belongsToMany('App\Tag');
    }
}

标签模型

class Tag {
    public function Article(){
      return $this->belongsToMany('App\Article');
    }
}

数据透视表

article_id === tag_id

我想搜索所有书籍使用标签的名称。我怎么能这样做?

我的解决方案

public function tagArticle($name)
{
    $tags = $this->tag->where('name',$name)->get();
    $articles = [];
    foreach ($tags as $tag) {
        $articles[] = $tag->articles;
    }
    return view('front.home')->with('articles',$articles);
}
  

这是我的解决方案,但我认为它并不好。有没有人有其他解决方案?谢谢。

3 个答案:

答案 0 :(得分:1)

使用whereHas()

 $articles=Article::whereHas('tags',function($query)
        {
            $query->where('name',$name);
        })->get();

答案 1 :(得分:1)

map使用flatten会更好。

$tags = $this->tag->where('name',$name)->get();

$articles = $tags->map(function($v) { 
    return $v->articles; 
})
->flatten()
->all();

flatten将返回同一级别的所有文章

[
   articleObject,
   articleObject,
   articleObject,
]

更多细节https://laravel.com/docs/5.3/collections#method-map

答案 2 :(得分:1)

使用eager loading

$tags = $this->tag->where('name', $name)->with('articles')->first();

此代码将加载标记及其所有文章。