1

我有一个名为Journey的父模型,它应该与模型类型地址的两个实例相关- 一次用于“起点”,一次用于“目的地”。我不知道什么是最有效的方法。当我返回旅程时,我想使用 Laravel 的 Eloquent ORM 和渴望加载来实现如下优雅的东西:

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

我尝试了以下方法:

1) 使用 Eloquent ORM 的一对一关系

Journey
-------
id
user_id
date

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

观察:

  • 在 Address 模型中需要“journey_id”,这意味着除了 Journeys 之外,我无法真正重用此模型
  • 地址与整个旅程相关联,因此我无法区分起点和终点实例

2) 使用 Eloquent ORM 的多态关系

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,以便我可以利用我的模型属性和功能?

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

4

1 回答 1

1

你应该拥有的是:

数据库结构

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

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

然后,将您的Journey模型链接到Address使用一对多关系:

Journey.php

class Journey extends Model {
    // ...

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

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

地址.php

class Address extends Model {
    // ...

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

    public function journeysAsDestination() {
        return $this->hasMany('Journey', 'destination_id');
    }
}
于 2013-10-27T23:52:20.343 回答