数据透视表的laravel关系问题

Posted

技术标签:

【中文标题】数据透视表的laravel关系问题【英文标题】:laravel relationship problems with pivot table 【发布时间】:2021-03-09 18:10:40 【问题描述】:

我试图用数据透视表中的关系来解决这个问题。我有 3 个表(产品、集合、集合产品)

产品表 ID 姓名 size_id

集合表 ID 名字

collection_product 表 id(我知道......我必须使用附加和分离)但稍后我会弄清楚如何解决它) collection_id product_id

模型

产品型号

public function collections()

    return $this->belongsToMany(Collection::class);

集合模型

public function products()

    return $this->belongsToMany(Product::class, 'collection_product');

ProductCollection 数据透视表

class ProductCollection extends Pivot

    protected $table = 'collection_product';

    public function collections()
    
        return $this->hasMany(Collection::class, 'collection_id');

    

    public function products()
    
        return $this->hasMany(Product::class, 'product_id');
    

在我的 CollectionController 中,我想搜索一个集合,对于集合中显示的所有产品,我只想在刀片视图中显示尺寸为“SMALL”(size_id)的产品,但我不知道如何在我的控制器,因为首先我需要修复关系,然后弄清楚如何声明一个条件来获取我的 products 表的 size_id。

【问题讨论】:

旁注:ProductCollection 上的关系 collectionsproducts 将是 belongsTo 而不是 hasMany 【参考方案1】:

您可以为您想要的集合预先加载产品并限制它加载的内容:

$col = Collection::with('products', fn ($q) => $q->where('size_id', ...))
     ->findOrFail(...);

@foreach ($col->products as $product)
   ...
@endforeach

您还可以获取所有产品并在迭代它们之前对其进行过滤:

$col = Collection::findOrFail(...);

@foreach ($col->products->where('size_id', ...) as $product)
    ...
@endforeach

【讨论】:

很好!!实际上它有效 $products = $collection->products->where('size_id', $sizeId->id);

以上是关于数据透视表的laravel关系问题的主要内容,如果未能解决你的问题,请参考以下文章

(Laravel)通过数据透视表的多态关系

Laravel中数据透视表的访问关系

laravel 使用具有多对多关系数据透视表的策略

是否可以在 Laravel 中获取数据透视表与另一个表的关系?

laravel 检索值匹配数据透视表的所有用户

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