【问题标题】:Laravel many-to-many relationship on the same model同一模型上的 Laravel 多对多关系
【发布时间】:2016-07-12 08:54:52
【问题描述】:

我有一个模特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?...)

【问题讨论】:

    标签: php laravel many-to-many relationship


    【解决方案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) 时,会发生几件事:

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

      像魅力一样工作!

      【讨论】:

      • 感谢分享!
      【解决方案3】:

      对于Many To Many relationshipbelongsToMany() 是正确的方法,但您还需要一个数据透视表来存储链接。

      【讨论】:

        猜你喜欢
        • 2016-02-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多