gpt4 book ai didi

Laravel 保存/更新多对多关系

转载 作者:行者123 更新时间:2023-12-03 05:18:42 32 4
gpt4 key购买 nike

任何人都可以帮助我如何保存多对多关系吗?我有任务,用户可以有很多任务,任务可以有很多用户(多对多),我想要实现的是,在更新表单中,管理员可以将多个用户分配给特定任务。这是通过 html 多选输入来完成的

name="taskParticipants[]"

这里的问题是,通过相同的表单(输入),您可以添加/删除用户,这就是我必须使用sync()的原因。也许我应该从头开始,但不知道从哪里开始......

这是我的用户模型:

public function tasks()
{
return $this->belongsToMany('Task','user_tasks');
}

任务模型

public function taskParticipants()
{
return $this->belongsToMany('User','user_tasks');
}

任务 Controller

public function update($task_id)
{
if (Input::has('taskParticipants'))
{
foreach(Input::get('taskParticipants') as $worker)
{
$task2 = $task->taskParticipants->toArray();
$task2 = array_add($task2,$task_id,$worker);
$task->taskParticipants()->sync(array($task2));
}
}
}

这是表格的结构 任务 id|标题|截止日期

user_tasks
id|task_id|user_id

最佳答案

tldr;sync 与第二个参数 false

<小时/>

两个模型上的多对多关系都是belongsToMany:

// Task model
public function users()
{
return $this->belongsToMany('User', 'user_tasks'); // assuming user_id and task_id as fk
}

// User model
public function tasks()
{
return $this->belongsToMany('Task', 'user_tasks');
}
<小时/>

为了添加新关系,请使用attachsync

两者的区别是:

1 attach 将在数据透视表上添加新行,而不检查它是否已经存在。当您有链接到该关系的其他数据时,这是很好的,例如:

用户考试与数据透视表链接尝试:id、user_id、exam_id、分数

我想这不是你所需要的:

$user->tasks()->getRelatedIds(); // [1,2,3,4,5,6]

$user->tasks()->attach([5,6,7]);
// then
$user->tasks()->getRelatedIds(); // [1,2,3,4,5,6,5,6,7]
<小时/>

2 sync 另一方面,将删除所有关系并重新设置它们:

$user->tasks()->getRelatedIds(); // [1,2,3,4,5,6]

$user->tasks()->sync([1,2,3]);
// then
$user->tasks()->getRelatedIds(); // [1,2,3]

或者它将建立新的关系,而不分离以前的关系并且不添加重复项:

$user->tasks()->sync([5,6,7,8], false); // 2nd param = detach
// then
$user->tasks()->getRelatedIds(); // [1,2,3,4,5,6,7,8]

关于Laravel 保存/更新多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24702640/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com