Laravel Eloquent 三个模型之间的多对多关系
Laravel Eloquent Many to Many Relationship between three Models
考虑我有以下 table 结构用于 tables countries
、products
和 suppliers
:
countries
------------------------
id
name
code
product
------------------------
id
name
price
suppliers
------------------------
id
name
A product
可以在不同的 countries
中出售,但 product
中的 supplier
可以不同。牢记这一点,我做了一个 relations
table 来跟踪哪个 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 与此 table 的关系,因为多对多关系仅适用于两个 table。关于这个还有其他解决方法吗?或者有没有其他有效的方法来实现这个场景?
感谢您的帮助。
没有使用三个表建立关系的内置方法。每当我自己遇到这样的事情时,最好的解决方案似乎是制作一个与三个表有关系的中间模型。
所以在你的情况下,我会创建一个 SupplierProduct
具有关系 country
、supplier
和 product
.
我也有相同的场景 class 有多个 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)');
}
作为 Jerodev ,我制作了一个中间模型 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');
}
}
考虑我有以下 table 结构用于 tables countries
、products
和 suppliers
:
countries
------------------------
id
name
code
product
------------------------
id
name
price
suppliers
------------------------
id
name
A product
可以在不同的 countries
中出售,但 product
中的 supplier
可以不同。牢记这一点,我做了一个 relations
table 来跟踪哪个 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 与此 table 的关系,因为多对多关系仅适用于两个 table。关于这个还有其他解决方法吗?或者有没有其他有效的方法来实现这个场景?
感谢您的帮助。
没有使用三个表建立关系的内置方法。每当我自己遇到这样的事情时,最好的解决方案似乎是制作一个与三个表有关系的中间模型。
所以在你的情况下,我会创建一个 SupplierProduct
具有关系 country
、supplier
和 product
.
我也有相同的场景 class 有多个 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)');
}
作为 Jerodev 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');
}
}