如何在 Laravel 中使用 pivot table 获取关系

How to get relations using pivot table in Laravel

我有 4 个 table 与此类似:

项目 (id)

子类别 (id | category_id)

item_subcategory (item_id | subcategory_id) --pivot table

类别 (id)


项目和子类别以多对多关系连接到枢轴 table。如何获取每个类别下的所有项目?下面是一个例子。

我不太明白,但也许这对你来说是一个解决方案,在你的模型中

public function Categories()
    {
        return $this->hasMany(Category::class,'id', 'categoryID');
    }

从我的角度来看,我们可以使用 3 种方法,我将全部分享。

  1. 链接关系:您可以在其他关系之上link关系,例如
Category::with(['subcategories' => function ($query) {
   $query->whereHas('items');
}])->get();

它将首先获取所有子类别,然后是类似的相关项目=>

[{
    "id": 1,
    "title": "Category 1",
    "subcategories": [{
        "id": 1,
        "category_id": 1,
        "title": "Subcategory 1",
        "items": [{
            "id": 1,
            "title": "Item 1",
            "pivot": {
                "subcategory_id": 1,
                "item_id": 1
            }
        }]
    }]
}]
  1. 将类别 ID 添加到数据透视表 table 并建立新关系,例如:
public function items()
{
   return $this->belongsToMany(Item::class, ItemSubcategory::class);
}

它将允许您直接获取产品而无需先加载子类别,诸如此类。

[{
    "id": 1,
    "title": "Category 1",
    "items": [{
        "id": 1,
        "title": "Item 1",
        "pivot": {
            "category_id": 1,
            "item_id": 1
        }
    }]
}]
  1. 使用 hasManyThrough,如果您的项目 table 包含子类别 ID,您可以通过依赖其他 类 创建关系。
    public function items()
    {
        return $this->hasManyThrough(Item::class, ItemSubcategory::class, null, 'id', null, 'item_id');
    }