拉拉韦在同一模型上建立了多对多的关系


Laravel many-to-many relationship on the same model

我有一个型号Job

一个Job可能需要完成其他Jobs才能开始。

一个CCD_ 4可以是同时用于许多CCD_。

所以,假设Job A依赖于Job BJob C,我希望能够调用job->requiredJobs并获得这两个作业。

目前,我有以下内容:

class Job extends Model
{
    public function requiredJobs() 
    {
        return $this->hasMany('App'Job', 'required_job_id');
    }
}

然而,我发现,如果我创建了一个Job D,并且它需要Job BJob C,它就会覆盖Job A的required jobs字段,因为它似乎是在将required_job_id添加到所需的作业上,而不是在依赖作业上创建一个数组。

希望这一切都有意义!我不完全确定我是否需要两个定义,或者hasMany是否是错误的关系(而不是belongsToMany?…)

尼克的回答把我推向了正确的方向。

以下是我最终如何定义我的模型:

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)时,会发生两件事:

  1. dependentJob得到一个ID required_job_ids的数组,我可以调用dependentJob->requiredJobs来得到整个作业模型列表
  2. requiredJob得到一个ID数组dependent_job_ids,我可以调用requiredJob->dependentJobs来得到整个作业模型列表

工作起来很有魅力!

对于多对多关系,belongsToMany()是正确的方法,但您也需要一个数据透视表来存储链接。

这只是为了增加任何在同一问题上寻找解决方案、关联同一模型的人。

在这里,您可以创建一个具有正常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');
}