多对多表和其他一对多表之间的关系

jckbn6z7  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(246)

大家早上好,
首先,我要说的是,我使用了laravel,因此,它是一个很有说服力的orm,但我认为它更像是一个纯粹的关系数据库问题(或者不是),所以这就是我在这里提到它的原因。
有一段时间,我和 many-to-many 表和一对多表。
有以下4个相关表格:
“机器”(id、名称…)
“产品”(id、名称……)
“机器产品”(id、机器id、产品id、价格)。
“限制”(id、机器\产品\ id、日期、开始\小时、结束\小时)
对于特定的机器和产品,有n个限制条件。
到目前为止,我认为一切都很好,但当我想把它转化为拉威尔模型时,怀疑就开始了。
原则上,我们有以下三种模式:
机器
产品
限制
(机器产品???理论上没有必要)
正常情况下, many-to-many 模型不需要制作,因为它们可以通过两个主要模型之一访问。在这种情况下,从 Machine 或者 Product 我们可以访问数据透视表 machine_products .
问题来自于 Machine 或者 Product 我想通过雄辩的方式 restrictions . 同样地,我也不知道如何访问 Machine 或者 Product 通过一个示例 restrictions .
我现在选择的一个选项是,尽管它只解决了第一个问题:

Restriction::find(Machine::find(1)->products()->first()->pivot->id);

我们可以建议一个更优雅和实用的解决方案,以获得产品/机器和向后的限制?
谢谢您!
编辑
我想要这样的东西: Machine::find(1)->products()->first()->restrictions 还是那个 Product::find(1)->machines()->first()->[pivot?]->restrictions .
我也希望能够做到这一点: Restriction::find(1)->[pivot?]->machine (或产品)
以下是三种模型:

class Machine extends Model
{
    public function products()
    {
        return $this->BelongsToMany('App\Product', 'machine_products')->withPivot('id','price');
   }
}

class Product extends Model
{  
    public function machines()
    {
        return $this->BelongsToMany('App\Machine', 'machine_products')->withPivot('price');
    }

}

class Restriction extends Model
{
    // Nothing
}
vlf7wbxs

vlf7wbxs1#

一般不建议(或没有必要)有一个 id 数据透视表中的列。
我会把它取下来,调整一下 restrictions 表格: id , machine_id , product_id , ...
这就满足了您的第二个要求: Restriction::find(1)->machine 相反的方向仍然是一个问题。我认为没有一个完美的解决方案:

Restriction::where('machine_id', $machine_id)
    ->where('product_id', $product_id)
    ->get();

你可以用一个范围来简化它:

class Restriction extends Model {
    public function scopeByIds($query, $machine_id, $product_id) {
        $query->where('machine_id', $machine_id)
            ->where('product_id', $product_id);
    }
}

Restriction::byIds($machine_id, $product_id)->get();

相关问题