同一模型上的 Laravel 多对多关系
Posted
技术标签:
【中文标题】同一模型上的 Laravel 多对多关系【英文标题】:Laravel many-to-many relationship on the same model 【发布时间】:2016-07-12 08:54:52 【问题描述】:我有一个模特Job
。
Job
可以要求其他Jobs
完成才能开始。
Job
可能同时是许多 Jobs
的必备工作。
所以,假设Job A
取决于Job B
和Job C
,我希望能够致电job->requiredJobs
并获得这两个工作。
就目前而言,我有以下几点:
class Job extends Model
public function requiredJobs()
return $this->hasMany('App\Job', 'required_job_id');
但是,我发现如果我创建一个 Job D
并让它需要 Job B
和 Job C
,它会覆盖 Job A
的所需工作字段,因为它似乎将 required_job_id
添加到所需的作业,而不是在依赖作业上创建数组。
希望这一切都有意义!我不完全确定我是否需要两个定义,或者hasMany
是否是错误的关系(而不是belongsToMany
?...)
【问题讨论】:
【参考方案1】:这只是为了补充任何在同一问题上寻找解决方案的人,涉及同一模型。
在这里,您可以使用普通的 Many to Many
关系创建一个连接表,并将 id 附加为普通的 Laravel 关系
public function requiredJobs()
return $this->belongsToMany('App\Job','dependent_jobs_required_jobs','dependent_job_ids','required_job_ids');
public function dependentJobs()
return $this->belongsToMany('App\Job','dependent_jobs_required_jobs','required_job_ids','dependent_job_ids');
【讨论】:
【参考方案2】:Nick 的回答将我推向了正确的方向。
这是我最终定义模型的方式:
class Job extends Model
public function requiredJobs()
return $this->belongsToMany('App\Job', null, 'dependent_job_ids', 'required_job_ids');
public function dependentJobs()
return $this->belongsToMany('App\Job', null, 'required_job_ids', 'dependent_job_ids');
这意味着当我打电话给dependentJob->requiredJobs()->save(requiredJob)
时,会发生几件事:
dependentJob
得到一个 ID 数组 required_job_ids
,我可以调用 dependentJob->requiredJobs
来获取整个工作模型列表。
requiredJob
得到一个 ID 数组 dependent_job_ids
,我可以调用 requiredJob->dependentJobs
来获取工作模型的完整列表。
像魅力一样工作!
【讨论】:
感谢分享!【参考方案3】:对于Many To Many relationship,belongsToMany()
是正确的方法,但您还需要一个数据透视表来存储链接。
【讨论】:
以上是关于同一模型上的 Laravel 多对多关系的主要内容,如果未能解决你的问题,请参考以下文章
从父多对多关系获取所有子模型 Laravel Eloquent