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

时间:2018-10-16 09:02:31

标签: mysql laravel eloquent relational-database

大家早上好,

首先,要说我使用的是Laravel,因此是Eloquent ORM,但我认为这更多是(或没有)纯粹的关系数据库问题,所以这就是为什么我在这里提到它。

有一阵子,我在many-to-many表和一对多表之间建立了联系。

有以下4个涉及的表:

  • “机器”(id,名称,...)
  • “产品”(id,名称,...)
  • “ machine_products”(id,machine_id,product_id,价格)。
  • “限制”(id,machine_product_id,day,begin_hour,end_hour)

特别是对于机器和产品,有N个限制。

到目前为止,我认为一切都很好,但是当我想将其转换为Laravel模型时,人们开始怀疑。

原则上,我们将拥有以下三个模型:

  • 机器
  • 产品
  • 限制
  • (MachineProduct ???在理论上没有必要)

通常不需要创建many-to-many模型,因为可以通过两个主要模型之一来访问它们。在这种情况下,我们可以从MachineProduct访问数据透视表machine_products

当我想通过口才通过MachineProduct的实例访问restrictions时出现问题。同样,我不知道如何通过Machine的实例访问Productrestrictions

尽管我只能选择第一个问题,但我现在选择的是一个选项:

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
}

1 个答案:

答案 0 :(得分:0)

通常不建议(或不必要)在数据透视表中使用id列。

我将其删除并调整restrictions表:idmachine_idproduct_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();