提问者:小点点

Laravel雄辩地解释了三种模型之间的多对多关系


请考虑以下表结构:表>代码>国家> /代码>、代码>产品< /代码>和<代码>供应商<代码>:

countries
------------------------
id
name
code
product
------------------------
id
name
price
suppliers
------------------------
id
name

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

relations
------------------------
country_id
product_id
supplier_id

假设我有一个产品a,我需要将其存储在USCA国家/地区,但这些国家/地区的供应商分别是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

我的问题是,由于多对多关系只能在两个表上工作,因此我如何对该表使用雄辩的关系。关于这一点,还有其他解决办法吗?或者有没有其他有效的方法来实现这个场景?

谢谢你的帮助。


共3个答案

匿名用户

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

因此,在您的情况下,我将创建一个供应商产品,它与国家供应商产品有关系。

匿名用户

我也有相同的场景类有多天Class细节使用这个函数在你的父模型

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函数检索与该记录相关的所有数据。

这就是我的模型的样子(数据库结构与问题中描述的相同):

供应商roduct.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');
    }
}