L5.5枢轴表与另一个模型的关系

时间:2018-01-19 07:38:37

标签: php laravel eloquent

在我的应用程序中,模型Device与模型Task具有多对多关系。 可以将设备和任务的组合分配给不同数量的模型User。 示例:Device A有一个任务Check something,这应由User Frank和Steven完成。

从我的观点来看,这应该是一个“标准问题”,但到目前为止我找不到合适的解决方案。

现在,我使用以下解决方法: a)在id数据透视表中添加了唯一ID device_task b)从数据透视表中查询id c)创建一个包含device_task_useruser_id的新表device_task_id b)使用查询构建器来获取/添加用户

但我真的不满意这个问题。

是否有可能,数据透视表还扩展了Model,然后与User建立了一对多的关系? 或者你会建议在数据透视表中添加一个json colum并将用户存储在那里吗?

任何想法都会非常受欢迎!

2 个答案:

答案 0 :(得分:2)

  

是否有可能,数据透视表也扩展了Model

是的,这是可能的。来自the docs

  

如果要定义自定义模型来表示关系的中间表,可以在定义关系时调用using方法。用于表示中间关系表的所有自定义模型都必须扩展Illuminate\Database\Eloquent\Relations\Pivot

您还可以在hasMany()belongsTo()模型之间创建新的TaskDevice关系,并使用它们以及现有的belongsToMany关系。并且您需要在枢轴模型和User模型之间定义新关系,以便能够按设备,任务或用户获取数据。

答案 1 :(得分:2)

修改多对多关系以保留额外的字段user_id

class Device extends Model
{

  public function tasks()
  {
    return $this->belongsToMany(
        Task::class,
        'device_task',
        'device_id',
        'task_id'
    )->withPivot('user_id');
  }

}

当更新在控制器中执行此操作时

$device->tasks()->attach([$taskId]=>['user_id']=>$userId);

当然,您需要DeviceTask模型以及has-many模型和User模型之间的DeviceTask关系来获取用户的任务