Laravel 同一模型上的多对多关系

Laravel many-to-many relationship on the same model

我有一个模型Job

A Job 可以要求其他 Jobs 完成后才能开始。

Job 可能是许多 Jobs 人的先决条件。

所以,假设 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_job_id 添加到所需的作业中,而不是在相关作业上创建数组。

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

对于 Many To Many relationshipbelongsToMany() 是正确的方法,但您还需要一个枢轴 table 来存储链接。

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

以下是我最终定义模型的方式:

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 获取整个工作模型列表。

很有魅力!

这只是为了补充任何在同一问题上寻找解决方案的人,涉及相同的模型。

您可以在此处创建具有正常 Many to Many 关系的加入 table 并像正常 Laravel 关系一样附加 ID

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');
}