如何在 Laravel 中的多对多关系中按类别创建过滤器?

发布于 2025-01-12 01:57:02 字数 358 浏览 1 评论 0原文

我在文章和类别模型之间有多对多,以及包含category_id 和article_id 记录的数据透视表。单击类别链接时,我将看到一个页面,其中显示与单击的类别相关的所有文章,但我无法在控制器中创建正确的功能。

public function showcategory($id){
    $articles=Article::whereHas('categories',function($query){
         $query->whereIn('category_id', $id);
    })->get();

    return view('categorydetail',compact('articles);
}

I have a many to many between Article and Category model and a pivot containing category_id and article_id records. At the click on the category link I would have a page that shows me all articles related to the category clicked but i can't create the right function in the controller.

public function showcategory($id){
    $articles=Article::whereHas('categories',function($query){
         $query->whereIn('category_id', $id);
    })->get();

    return view('categorydetail',compact('articles);
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

动次打次papapa 2025-01-19 01:57:02

你的代码看起来不太好。 Eloquent whereIn 期望一个数组作为第二个参数。使用 where 代替。

$articles=Article::whereHas('categories',function($query){
     $query->where('category_id', $id);
})->get();

理想情况下,这不是最佳实践。您最好尝试以下流程:

//Category.php
public function articles() {
    return $this->belongsTo(Article::class);
}
//Controller
    $category = Category::with('articles')->find($id);
    if (empty($category)) {
        //show 404 error or redirection
    }
    $articles = $category->articles()->get();

Your code seems not fine. Eloquent whereIn is expecting an array as second parameter. Use where instead.

$articles=Article::whereHas('categories',function($query){
     $query->where('category_id', $id);
})->get();

Ideally, this is not the best practice. You'd better try the flow below:

//Category.php
public function articles() {
    return $this->belongsTo(Article::class);
}
//Controller
    $category = Category::with('articles')->find($id);
    if (empty($category)) {
        //show 404 error or redirection
    }
    $articles = $category->articles()->get();
别在捏我脸啦 2025-01-19 01:57:02

你的代码是正确的,你只需要传递 id 变量

即可 使用代码传递变量,添加以下代码 use($id)
你应该使用 where 而不是 whereIn

public function showcategory($id){
     $articles=Article::whereHas('categories',function($query) use($id){
          $query->where('category_id', $id);
     })->get();
    
     return view('categorydetail',compact('articles));
}

还有另一种方法

public function showcategory($id){
     $category= Category::find($id);
     empty($category) ? abort(404) : '';
     $articles = $category->articles()->paginate(10);
     return view('categorydetail',compact('articles));
}

Your code is correct, you just need to pass the id variable

The variable is passed using the code by adding the following code use($id)
You should use where instead of whereIn

public function showcategory($id){
     $articles=Article::whereHas('categories',function($query) use($id){
          $query->where('category_id', $id);
     })->get();
    
     return view('categorydetail',compact('articles));
}

There is also another way

public function showcategory($id){
     $category= Category::find($id);
     empty($category) ? abort(404) : '';
     $articles = $category->articles()->paginate(10);
     return view('categorydetail',compact('articles));
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文