问题描述
我有 Post、Tag 和 Category 模型。我知道如何按标签或按类别获取帖子。但我需要同时(一次)按所选标签和类别获取帖子。有人可以帮忙吗?我使用 Laravel 8。
后模型
class Post extends Model
{
public function category()
{
return $this->belongsTo(Category::class);
}
public function tags()
{
return $this->belongsToMany(
Tag::class,'post_tag','post_id','tag_id'
);
}
}
标签模型
class Tag extends Model
{
public function posts()
{
return $this->belongsToMany(
Post::class,'tag_id','post_id'
)->withTimestamps();
}
}
类别模型
class Category extends Model
{
public function posts()
{
return $this->hasMany(Post::class);
}
}
发布控制器的方法
class PostController extends Controller
{
public function show($slug)
{
$post = Post::where('slug',$slug)->orderBy('date','desc')->firstOrFail();
return view('pages.post',compact('post'));
}
public function tag($slug)
{
$tag = Tag::where('slug',$slug)->firstOrFail();
$posts = $tag->posts()->orderBy('date','desc')->paginate(7);
return view('pages.postlist',['posts' => $posts]);
}
public function category($slug)
{
$category = Category::where('slug',$slug)->firstOrFail();
$posts = $category->posts()->orderBy('date',['posts' => $posts]);
}
}
路线
Route::get('/posts/{slug}','App\Http\Controllers\PostController@show')->name('post.show');
Route::get('/posts/tag/{slug}','App\Http\Controllers\PostController@tag')->name('ptag.show');
Route::get('/posts/category/{slug}','App\Http\Controllers\PostController@category')->name('pcategory.show');
解决方法
您可能想要使用 whereHas:
$categoryId = 1;
$tagId = 2;
Post::whereHas('category',function ($query) use ($categoryId) {
$query->whereKey($categoryId);
})->whereHas('tags',function ($query) use ($tagId) {
$query->whereKey($tagId);
})->get();