Eloquent ORM - 如何在父模型中处理与同一子模型的两个实例的关系

时间:2013-10-27 23:19:20

标签: php laravel eloquent

我有一个名为 Journey 的父模型,它应该与模型类型地址的两个实例相关 - 一次用于' origin'和一次目的地'。我无法找出最有效的方法。当我回到旅途中时,我想用Laravel的Eloquent ORM和渴望加载来实现如下的优雅:

return Journey::with('origin','destination');

我尝试过以下方法:

1)使用Eloquent ORM' s one to one relationships

Journey
-------
id
user_id
date

Address
-------
id
journey_id
street
city
zipcode

观察:

  • 需要' journey_id'在地址模型中,这意味着我无法将此模型重新用于除了Journeys之外的任何其他内容
  • 地址与整个旅程相关联,因此我无法区分原始和目的地实例

2)使用Eloquent ORM' s polymorphic relationships

Journey
-------
id
user_id
date

Address
-------
id
street
city
zipcode
addressable_id
addressable_type

观察:

  • 我现在可以在其他模型中重复使用Address模型,但是......
  • 地址仍然与整个旅程相关联,因此我无法区分原始和目的地实例

3)关联' journey.origin'或者' journey.destination'将其加入' address.id'

Journey
-------
id
user_id
origin (address.id)
destination (address.id)
date

Address
-------
id
street
city
zipcode

观察:

  • 我现在可以区分起源和目的地实例,但......
  • 我想我必须对联接使用流畅的查询,所以我不会得到起源和&目的地返回地址模型
  • 从地址到旅程没有回传链接

有没有人对表格/关系结构有任何建议,使得旅程(原点和目的地)插入和选择尽可能优雅,最好使用Eloquent以便我可以利用我的模型属性和功能?

此外,虽然通过旅程模型访问地址将是主要用例,但我也希望能够通过地址模型访问父旅程。

1 个答案:

答案 0 :(得分:1)

你应该拥有的是:

数据库结构

Journey
---------
id
origin_id
destionation_id
user_id
date

Address
---------
id
street
city
zipcode

然后,使用One-to-Many关系将Journey模型与Address相关联:

<强> Journey.php

class Journey extends Model {
    // ...

    public function origin() {
        return $this->belongsTo('Address');
    }

    public function destination() {
        return $this->belongsTo('Address');
    }
}

<强> Address.php

class Address extends Model {
    // ...

    public function journeysAsOrigin() {
        return $this->hasMany('Journey', 'origin_id');
    }

    public function journeysAsDestination() {
        return $this->hasMany('Journey', 'destination_id');
    }
}