使用数据透视表按类别 ID 获取产品

Posted

技术标签:

【中文标题】使用数据透视表按类别 ID 获取产品【英文标题】:Fetch products by category id using pivot table 【发布时间】:2021-09-02 01:16:51 【问题描述】:

我有一个函数,我在其中传递类别 ID,并基于该函数获取所有产品。

这是我的数据库的结构

分类数据库:

category_name

产品数据库:

product_name;

类别产品:

category_id;
product_id;

下面是它们之间的关系

在产品中:

public function categories()
    
        return $this->belongsToMany(Category::class);
    

在类别中:

public function products()
    
        return $this->belongsToMany(Product::class);
    

我已经测试了多个查询,但对我的情况没有任何效果。

【问题讨论】:

数据库中的类别和产品表的名称是什么。您也可以显示您是如何执行查询的 它基本上只是一个类别的名称,在产品中它是产品名称。 我正在以这种方式执行查询 $categoryId = 1; $products = Product::whereHas('categories', function ($query) use($categoryId) $query->where('id', $categoryId); )->get(); 你能在数据库中显示两个表的表名吗 产品、类别和数据透视表 category_product 【参考方案1】:

您可以通过两种不同的方式进行操作

验证类别是否存在的间接方式(2 个查询)

$category = Category::with('products')->findOrFail($categoryId);
// you can also do without the with(); only one id, so no benefit for the eager load
// $category = Category::findOrFail($categoryId);
$products = $category->products;

直接方式,如果类别不存在(但没有消息)将返回一个空集合(1 个查询)

$products = Product::whereHas('categories', function($qbCategory) use($categoryId) 
    $qbCategory->where('id',$categoryId);
)->get();

【讨论】:

它确实适用于我的情况,实际上我在获取产品之前肯定会有类别,所以第一个对我有用,但是第二个也是避免错误的好方法。 @SyedKhizer 实际上,我通常使用第一个来避免错误。知道输入是否有问题是一件好事。

以上是关于使用数据透视表按类别 ID 获取产品的主要内容,如果未能解决你的问题,请参考以下文章

Eloquent Query:所有具有相同类别的新闻。数据透视表

Laravel 根据数据透视表从表中获取标题

数据透视表的laravel关系问题

php sql中带有日期、变量类别和总和值的数据透视表

Excel数据透视表、切片器如何做?

使用数据透视表数据获取关系表的信息