【问题标题】:Laravel relationships - 3-way tableLaravel 关系 - 三向表
【发布时间】:2014-10-29 16:01:24
【问题描述】:

我有 3 个模型:BasketProductAsset

一个Basket可以包含多个Assets,一个资产可以出现在多个Baskets中。

一个Product 可以有多个Asset,但一个Asset 也可以分配给多个Product

目的是将Assets 转换为Basket,同时仍知道它是从哪个Product 添加的。


我设想的表结构是这样的:

-------------------------------------
| basket_id | asset_id | product_id |
-------------------------------------
|         1 |        1 |          1 |
|         1 |        3 |          1 |
|         1 |       15 |          2 |
|         2 |       23 |          1 |
|         2 |        3 |          1 |
|         3 |       79 |          3 |
-------------------------------------

我还设想了一个类似这样的模型设置:

class Basket extends Eloquent {
    public function assets() {
        return $this->belongsToMany('Asset');
    }
}

class Product extends Eloquent {
    public function assets() {
        return $this->belongsToMany('Asset');
    }
}

class Asset extends Eloquent {
    public function products() {
        return $this->belongsToMany('Product');
    }

    public function product() {
        // This should return the product from the product_id column
    }
}

我不确定如何编写 Asset::product() 以便返回相应的 Product

我想调用Basket::find(1)->assets()->first()->product; 之类的电话来获取将第一个资产添加到购物篮的产品。

【问题讨论】:

  • 如果我理解正确的话,关系的“多”部分实际上有点用词不当——它们的工作方式受到限制。即,给定一个assetproduct 组合,将始终只有一个product 匹配(不管事实上assets 拥有并属于products 和basket s,等等)所以,如果是这样的话,我们有一些工作要做(但你能确认一下吗?)。但是,使用普通的 Eloquent 关系是不可行的,因为给定的 asset 实例不知道它是从潜在的许多 baskets 中检索到的。
  • @JarekTkaczyk 我认为看起来很理想 - 有没有办法在 Composer 中轻松使用它?
  • @alexrussell 调用Asset::find(1)->products 应该返回分配给Asset 的所有Products。调用Basket::assets()->first()->products 应该做同样的事情(注意复数->products。调用Basket::assets()->first()->product 应该返回Product Asset 附加到Basket 与(注意单数->product)。跨度>
  • 是的,但您必须意识到从 $basket->assets() 返回的 Assets 实际上并不知道您要求的原始 basket 的任何内容。这就是为什么你不能使用传统的 Eloquent 关系来获得你想要的东西的原因。如果在Basket#assets() 中使用->withPivot('product_id'),则asset 将拥有来自数据透视表的原始product_id。从那里,您应该能够使用它来获取该资产的(单个)product。那有意义吗?但我认为你仍然必须手动完成这项工作。

标签: php laravel eloquent relationship


【解决方案1】:

这里有一小块可以满足你的需要

https://github.com/jarektkaczyk/Eloquent-triple-pivot

感谢您的 PR,在 packagist 上提供了一个包:

https://packagist.org/packages/jarektkaczyk/eloquent-triple-pivot

【讨论】:

    猜你喜欢
    • 2015-08-03
    • 1970-01-01
    • 2013-05-27
    • 1970-01-01
    • 2018-03-28
    • 2015-08-19
    • 1970-01-01
    • 2021-01-27
    • 2021-07-23
    相关资源
    最近更新 更多