Laravel Eloquent三个模型之间的多对多关系

4
考虑我有以下表结构:countriesproductssuppliers。这些表是与IT技术相关联的。
countries
------------------------
id
name
code

product
------------------------
id
name
price

suppliers
------------------------
id
name

一个产品可以在不同的国家销售,但是该产品的供应商可以不同。考虑到这一点,我制作了一个关系表来跟踪哪个供应商在哪个国家交付哪个产品。
relations
------------------------
country_id
product_id
supplier_id

假设我有一个产品A,需要存储在美国加拿大,但这些国家的供应商分别是XY。结构将如下所示:

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 关系来处理这个表格,因为多对多关系只适用于两个表格。是否有其他解决方法?或者是否有其他有效的实现此场景的方式?

感谢您的帮助。

3个回答

2

没有内置的方法可以使用三个表来建立关系。每当我自己遇到这样的情况时,最好的解决方案似乎是创建一个中间模型,该模型与三个表具有关系。

因此,在您的情况下,我会创建一个名为SupplierProduct的模型,该模型与countrysupplierproduct具有关系。


0

正如 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');
    }
}

0

我也有同样的情况,类中有多个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)');
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接