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

Php 雄辩的ORM-如何处理与父模型中同一子模型的两个实例的关系,php,laravel,eloquent,Php,Laravel,Eloquent,我有一个名为旅程的父模型,它应该与模型类型地址的两个实例相关,一个用于“起点”,一个用于“终点”。我不知道做这件事最有效的方法是什么。我想使用拉雷维尔的雄辩ORM和渴望加载来实现以下优雅的东西,当我返回旅程时: return Journey::with('origin','destination'); 我尝试了以下方法: 1) 使用雄辩的ORM 意见: 在地址模型中需要“旅程\ id”,这意味着我不能将此模型用于除旅程以外的任何其他用途 地址作为一个整体链接到旅程,所以我无法区分起点和终点实

我有一个名为旅程的父模型,它应该与模型类型地址的两个实例相关,一个用于“起点”,一个用于“终点”。我不知道做这件事最有效的方法是什么。我想使用拉雷维尔的雄辩ORM和渴望加载来实现以下优雅的东西,当我返回旅程时:

return Journey::with('origin','destination');
我尝试了以下方法:

1) 使用雄辩的ORM

意见:

  • 在地址模型中需要“旅程\ id”,这意味着我不能将此模型用于除旅程以外的任何其他用途
  • 地址作为一个整体链接到旅程,所以我无法区分起点和终点实例
2) 使用雄辩的ORM

意见:

  • 我现在可以将地址模型与其他模型一起重复使用,但是
  • 地址仍然作为一个整体链接到旅程,所以我无法区分起点和终点实例
3) 通过将“旅程.起点”或“旅程.目的地”连接到“地址.id”来关联“旅程.起点”或“旅程.目的地”

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

Address
-------
id
street
city
zipcode
意见:

  • 我现在可以区分源实例和目标实例,但是
  • 我想我必须对连接使用流畅的查询,所以我不能将origin和destination作为地址模型返回
  • 没有从地址返回到旅程的链接
是否有人对表格/关系结构有任何建议,使旅程(带起点和终点)的插入和选择尽可能优雅,最好使用雄辩的方式,以便我可以利用我的模型属性和功能


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

您应该拥有的是:

数据库结构

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

Address
---------
id
street
city
zipcode
然后,使用关系将您的
旅程
模型链接到
地址

travely.php

class Journey extends Model {
    // ...

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

    public function destination() {
        return $this->belongsTo('Address');
    }
}
class Address extends Model {
    // ...

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

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

class Journey extends Model {
    // ...

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

    public function destination() {
        return $this->belongsTo('Address');
    }
}
class Address extends Model {
    // ...

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

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

你应该做的是:

数据库结构

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

Address
---------
id
street
city
zipcode
然后,使用关系将您的
旅程
模型链接到
地址

travely.php

class Journey extends Model {
    // ...

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

    public function destination() {
        return $this->belongsTo('Address');
    }
}
class Address extends Model {
    // ...

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

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

class Journey extends Model {
    // ...

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

    public function destination() {
        return $this->belongsTo('Address');
    }
}
class Address extends Model {
    // ...

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

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

您是否有多个
旅程
,具有相同的
目的地
起点
?这是最终目标。但现在我可以忍受地址被复制的情况,如果这样做更容易的话。你会有多个
旅程
,具有相同的
目的地
来源地
?这是最终目标。但现在我可以忍受地址被复制,如果这能让事情变得更容易的话。