Laravel在同一型号上的多对多关系

时间:2016-03-24 16:52:11

标签: php laravel many-to-many relationship

我有一个模型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 个答案:

答案 0 :(得分:1)

对于Many To Many relationshipfunction filter_input_fix ($type, $variable_name, $filter = FILTER_DEFAULT, $options = NULL ) { $checkTypes =[ INPUT_GET, INPUT_POST, INPUT_COOKIE ]; if ($options === NULL) { // No idea if this should be here or not // Maybe someone could let me know if this should be removed? $options = FILTER_NULL_ON_FAILURE; } if (in_array($type, $checkTypes) || filter_has_var($type, $variable_name)) { return filter_input($type, $variable_name, $filter, $options); } else if ($type == INPUT_SERVER && isset($_SERVER[$variable_name])) { return filter_var($_SERVER[$variable_name], $filter, $options); } else if ($type == INPUT_ENV && isset($_ENV[$variable_name])) { return filter_var($_ENV[$variable_name], $filter, $options); } else { return NULL; } } 是正确的方法,但您还需要一个数据透视表来存储链接。

答案 1 :(得分:1)

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. 像魅力一样!

答案 2 :(得分:0)

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

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