大家早上好,
首先,要说我使用的是Laravel,因此是Eloquent ORM,但我认为这更多是(或没有)纯粹的关系数据库问题,所以这就是为什么我在这里提到它。
有一阵子,我在many-to-many
表和一对多表之间建立了联系。
有以下4个涉及的表:
特别是对于机器和产品,有N个限制。
到目前为止,我认为一切都很好,但是当我想将其转换为Laravel模型时,人们开始怀疑。
原则上,我们将拥有以下三个模型:
通常不需要创建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
}
答案 0 :(得分:0)
通常不建议(或不必要)在数据透视表中使用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();