Laravel Eloquent 三个模型之间的多对多关系
Posted
技术标签:
【中文标题】Laravel Eloquent 三个模型之间的多对多关系【英文标题】:Laravel Eloquent Many to Many Relationship between three Models 【发布时间】:2020-03-27 21:11:39 【问题描述】:考虑我对表countries
、products
和suppliers
有以下表结构:
countries
------------------------
id
name
code
product
------------------------
id
name
price
suppliers
------------------------
id
name
product
可以以不同的countries
出售,但supplier
其中的product
可以不同。考虑到这一点,我制作了一个relations
表来跟踪哪个supplier
正在交付哪个product
,其中country
:
relations
------------------------
country_id
product_id
supplier_id
假设我有一个产品A
需要存储在国家US
和CA
,但这些国家的供应商分别是X
和Y
。结构看起来像这样:
countries
-------------------------------
id | name | code
-------------------------------
1 | United States | US
2 | Canada | CA
product
-------------------------------
id | name | price
-------------------------------
1 | A | 3.99
suppliers
------------
id | name
------------
1 | X
2 | Y
relations
-------------------------------
country_id | product_id | supplier_id
-------------------------------
1 | 1 | 1
2 | 1 | 2
我的问题是如何使用 Eloquent 关系到这个表,因为多对多关系只适用于两个表。还有其他解决方法吗?或者有没有其他有效的方法来实现这个场景?
感谢您的帮助。
【问题讨论】:
【参考方案1】:作为Jerodev suggested,我制作了一个中间模型SupplierProduct
。我没有建立多对多关系,而是与SupplierProduct
建立一对多关系,并使用with
函数检索数据以检索与该记录相关的所有数据。
这就是我的模型的样子(数据库结构与所描述的相同):
SupplierProduct.php
namespace App;
use Illuminate\Database\Eloquent\Model;
class SupplierProduct extends Model
public function country()
return $this->belongsTo(Country::class);
public function product()
return $this->belongsTo(Product::class);
public function supplier()
return $this->belongsTo(Supplier::class);
Country.php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Country extends Model
public function products()
return $this->hasMany(SupplierProduct::class)->with('product', 'supplier');
Product.php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Product extends Model
public function products()
return $this->hasMany(SupplierProduct::class)->with('country', 'supplier');
Supplier.php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Supplier extends Model
public function products()
return $this->hasMany(SupplierProduct::class)->with('country', 'product');
【讨论】:
【参考方案2】:我也有相同的场景类有多个 DaysClassDetails 在你的父模型中使用这个函数
public function classType()
return $this->hasMany('App\DaysClassDetails(middlemodel)');
而且 DaysClassDetails 有多个 DaysClassTimeDetails
public function classTime()
return $this->hasMany('App\DaysClassTimeDetails(lastchildmodel)');
public function classType()
return $this->belongsTo('App\ManageClass(parentmodel)');
【讨论】:
【参考方案3】:没有使用三个表建立关系的内置方法。每当我自己遇到这样的事情时,最好的解决方案似乎是制作一个与三个表有关系的中间模型。
因此,在您的情况下,我将创建一个 SupplierProduct
,它具有 country
、supplier
和 product
的关系。
【讨论】:
以上是关于Laravel Eloquent 三个模型之间的多对多关系的主要内容,如果未能解决你的问题,请参考以下文章
与多个中间表的多对多 Laravel Eloquent 关系