我有一个与posts
表有多对多关系的tags
表,使用名为tagspivot
的数据透视表连接。我使用以下方法显示帖子:
public function showpost($titleslug) {
$post = Post::where('titleslug','=',$titleslug)->first();
return view('posts/show', compact('post', $post));
}
然后我在view
中加载帖子标签,如:
@foreach($post->tags as $ptags)
<li><a href="{{route('showtag', $ptags->titleslug)}}" class="button smallGrey">#{{$ptags->title}}</a></li>
@endforeach
我的问题是,如何获取与当前展示帖子具有相同标签的帖子列表?它不必是完全相同的标签,就像其他帖子有一个或两个常见标签一样。如果可能,列表将按照当前显示帖子的最常见标记的帖子进行排序。
这就是全部,抱歉我的英语不好
帖子表:
public function up() {
Schema::create('posts', function (Blueprint $table) {
$table->increments('id');
$table->string('title');
$table->text('content');
$table->string('titleslug');
$table->timestamps();
});
}
标签表:
public function up() {
Schema::create('tags', function (Blueprint $table) {
$table->increments('id');
$table->string('title');
$table->string('titleslug');
$table->timestamps();
});
}
Tagspivot表:
public function up() {
Schema::create('tagspivot', function (Blueprint $table) {
// Create tabel tagspivot
$table->increments('id');
$table->integer('post_id')->nullable()->unsigned()->index();
$table->integer('tag_id')->nullable()->unsigned()->index();
$table->timestamps();
// Set FK tagspivot --- posts
$table->foreign('post_id')
->references('id')
->on('posts')
->onDelete('cascade')
->onUpdate('cascade');
// Set FK tagspivot --- tags
$table->foreign('tag_id')
->references('id')
->on('tags')
->onDelete('cascade')
->onUpdate('cascade');
});
}
Post模型中的关系:
public function tags()
{
return $this->belongsToMany('App\Tag', 'tagspivot', 'post_id', 'tag_id')->withTimeStamps();
}
标签模型中的关系:
public function posts() {
return $this->belongsToMany('App\Post', 'tagspivot', 'tag_id', 'post_id');
}
答案 0 :(得分:0)
如果你想通过当前的$ titleslug获得所有帖子,你需要使用 whereHas 方法:
Post::whereHas('tags', function ($query) use ($titleslug) {
$query->where('slug', $titleslug);
})->get();
如果您正确地编写关系,此代码将起作用。有关whereHas和其他有用的关系方法的更多信息,请观察:
Querying Relationship Existence
希望它能帮助您找到正确的解决方案:)