在laravel中查找与标签关联的所有帖子

时间:2018-03-24 08:53:31

标签: php mysql laravel laravel-5 eloquent

我正在使用laravel构建一个博客,其中一个帖子有很多标签。我想通过标签过滤所有帖子。意味着如果我点击" PHP"我希望获得所有相关帖子。

这是我的代码

我首先有两个表用于标签,第二个表用于带有帖子的链接

tag_table

 public function up()
{
    Schema::create('tags', function (Blueprint $table) {
        $table->increments('id');
        $table->string('tags');
        $table->timestamps();
    });
}

关系标记表

public function up()
{
    Schema::create('article_tag', function (Blueprint $table) {
      $table->increments('id');
      $table->integer('article_id')->unsigned();
      $table->foreign('article_id')->references('id')->on('articles');
      $table->integer('tag_id')->unsigned();
      $table->foreign('tag_id')->references('id')->on('tags');
    });
}

文章模型

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

标记模型

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

标记控制器

 public function show($id,$name)
{
   //here I received tag id and name.

 $list->with('articles')->get();
 return view('articles.tagshow')->withList($list);

}

1 个答案:

答案 0 :(得分:2)

Eloquent提供了 whereHas 方法,可让您过滤相关模型的属性。要按相关标签的名称过滤文章,您应该执行以下操作:

$articles = Article::whereHas('tags', function($query) use ($tagName) {
  $query->whereName($tagName);
})->get();

但是,在你的情况下它应该更简单,因为你已经在你的控制器中有标签ID,所以你可以简单地通过ID获得标签模型,然后返回相关的文章:

public function show($id,$name) {
  return Tag::findOrFail($id)->articles;
}

查看有关查询关系的文档以获取更多详细信息:https://laravel.com/docs/5.6/eloquent-relationships#querying-relations