将Eloquent的ORM与Laravel一起使用的最佳方式是什么?

时间:2014-11-24 17:45:40

标签: php mysql laravel-4

我有两张桌子:

treatments (
id,
name
)

companies (
id,
name
)

我需要与“价格”表建立关系。我想做的事情如下:

prices (
treatment_id,
company_id,
price
)

但我不知道如何将ORM应用于php应用程序。我正在使用Laravel和Eloguent的ORM。我认为真正的问题是,如果这是设计数据库的好方法。也许我应该让它变得不同? 有什么建议吗? 谢谢, 班。

1 个答案:

答案 0 :(得分:2)

如果公司可以有多种治疗,并且可以从不同价格的多家公司购买治疗,那么您就有Many-to-many关系,prices是支点表(如果您愿意约定将被命名为company_treament,但这不是必须的。因此,您需要为TreatmentsCompanies设置两个模型,如下所示:

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_idcompany_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));