【问题标题】:How to get posts by current tag and category simultaneously in Laravel?如何在 Laravel 中同时按当前标签和类别获取帖子?
【发布时间】:2021-03-29 20:39:43
【问题描述】:

我有 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,
            'post_tag',
            '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', 'desc')->paginate(7);
        return view('pages.postlist', ['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');

【问题讨论】:

  • 在你的控制器中使用多个where
  • 我需要从不同的表中获取数据。所以,我不明白如何在这里使用多个where
  • 尝试使用whereHas。相关问题:stackoverflow.com/questions/35478498/…。你也可以一起使用Query Builder + join + where

标签: php laravel has-and-belongs-to-many belongs-to


【解决方案1】:

您可能想使用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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-15
    • 1970-01-01
    • 2018-06-24
    • 1970-01-01
    • 2017-07-22
    • 1970-01-01
    • 2014-12-12
    相关资源
    最近更新 更多