在我的应用程序中,模型Device
与模型Task
具有多对多关系。
可以将设备和任务的组合分配给不同数量的模型User
。
示例:Device
A有一个任务Check something
,这应由User
Frank和Steven完成。
从我的观点来看,这应该是一个“标准问题”,但到目前为止我找不到合适的解决方案。
现在,我使用以下解决方法:
a)在id
数据透视表中添加了唯一ID device_task
b)从数据透视表中查询id
c)创建一个包含device_task_user
和user_id
的新表device_task_id
b)使用查询构建器来获取/添加用户
但我真的不满意这个问题。
是否有可能,数据透视表还扩展了Model,然后与User
建立了一对多的关系?
或者你会建议在数据透视表中添加一个json colum并将用户存储在那里吗?
任何想法都会非常受欢迎!
答案 0 :(得分:2)
是否有可能,数据透视表也扩展了Model
是的,这是可能的。来自the docs:
如果要定义自定义模型来表示关系的中间表,可以在定义关系时调用using方法。用于表示中间关系表的所有自定义模型都必须扩展
Illuminate\Database\Eloquent\Relations\Pivot
类
您还可以在hasMany()
和belongsTo()
模型之间创建新的Task
和Device
关系,并使用它们以及现有的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
关系来获取用户的任务