我有两张桌子:
treatments (
id,
name
)
companies (
id,
name
)
我需要与“价格”表建立关系。我想做的事情如下:
prices (
treatment_id,
company_id,
price
)
但我不知道如何将ORM应用于php应用程序。我正在使用Laravel和Eloguent的ORM。我认为真正的问题是,如果这是设计数据库的好方法。也许我应该让它变得不同? 有什么建议吗? 谢谢, 班。
答案 0 :(得分:2)
如果公司可以有多种治疗,并且可以从不同价格的多家公司购买治疗,那么您就有Many-to-many关系,prices
是支点表(如果您愿意约定将被命名为company_treament
,但这不是必须的。因此,您需要为Treatments
和Companies
设置两个模型,如下所示:
class Company extends \Eloquent {
public function treatments()
{
return $this->belongsToMany('Treatment', 'prices')->withPivot('price');
}
和
class Treatment extends \Eloquent {
public function companies()
{
return $this->belongsToMany('Company', 'prices')->withPivot('price');
}
}
模型中的treatments()
和companies()
方法负责获取相关项。通常hasMany
方法只需要将相关模型作为第一个参数,但在您的情况下,数据透视表名称是非标准的,并通过将其作为第二个参数传递来设置为prices
。通常对于数据透视表,只会提取关系列(treatment_id
和company_id
),因此您需要使用withPivot
指定额外列。因此,如果您希望获得具有id 1列表的公司的治疗,您可以使用以下内容:
$treatments = Company::find(1)->treatments;
反之亦然:
$companies = Treatment::find(1)->companies;
如果您需要访问任何这些关系的价格,您可以这样做:
foreach ($treatments as $treatment)
{
$price = $treatment->pivot->price;
}
您可以在Laravel Docs中了解有关如何使用Eloquent实现关系的更多信息。
要在数据透视表中插入关系条目,您可以使用attach
并删除一次使用detach
(有关详细信息,请阅读Docs)。
$treatment->companies()->attach($companyId, array('price' => $price));
$treatment->companies()->detach($companyId);
要更新数据透视表条目,请使用updateExistingPivot
:
$treatment->companies()->updateExistingPivot($companyId, array('price' => $price));