Laravel同一模型的多对多关系

3

我有一个模型 Job

一个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代替?...)
3个回答

5

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)时,会发生以下几件事情:
  1. dependentJob获得一个ID数组required_job_ids,我可以调用dependentJob->requiredJobs来获取整个作业模型列表。
  2. requiredJob获得一个ID数组dependent_job_ids,我可以调用requiredJob->dependentJobs来获取整个作业模型列表。
简直太完美了!

谢谢分享! - Tom Redman

4

对于多对多关系belongsToMany()是正确的方法,但您还需要一个中间表来存储链接。


1
这只是为了补充那些寻找相同问题解决方案的人,涉及相同的模型。
在此,您可以使用普通的“多对多”关系创建连接表,并像普通的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');
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接