【问题标题】:Eloquent ORM - How to handle relationships with two instances of the same child model in parent modelEloquent ORM - 如何处理与父模型中同一子模型的两个实例的关系
【发布时间】:2013-11-06 15:20:30
【问题描述】:

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

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

我尝试了以下方法:

1) 使用 Eloquent ORM 的 one to one relationships

Journey
-------
id
user_id
date

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

观察:

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

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

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

【问题讨论】:

  • 您会有多个Journey 与相同的destionationorigin 吗?
  • 这是最终目标。但现在我可以忍受重复的地址,如果这样更容易的话。

标签: php laravel eloquent


【解决方案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');
    }
}

地址.php

class Address extends Model {
    // ...

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

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

【讨论】:

    猜你喜欢
    • 2015-10-29
    • 1970-01-01
    • 2016-02-21
    • 2014-11-22
    • 2015-03-05
    • 2018-12-29
    • 2021-07-04
    • 2018-04-12
    • 2016-04-17
    相关资源
    最近更新 更多