Sup*_*nSL 74 relationship laravel eloquent laravel-4
任何人都可以帮助我如何保存多对多的关系?我有任务,用户可以有很多任务,任务可以有很多用户(多对多),我想要实现的是在更新表单管理员可以为多个用户分配特定任务.这是通过html多选输入完成的
name="taskParticipants[]"
Run Code Online (Sandbox Code Playgroud)
这里的问题是,通过相同的形式(输入),您可以添加/删除用户,这就是我必须使用sync()的原因.也许我应该从头开始但不知道从哪里开始......
这是我的用户模型:
public function tasks()
{
return $this->belongsToMany('Task','user_tasks');
}
Run Code Online (Sandbox Code Playgroud)
任务模型
public function taskParticipants()
{
return $this->belongsToMany('User','user_tasks');
}
Run Code Online (Sandbox Code Playgroud)
TaskController
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));
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是表 任务id | title |截止日期的结构
user_tasks
id|task_id|user_id
Run Code Online (Sandbox Code Playgroud)
Jar*_*zyk 167
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');
}
Run Code Online (Sandbox Code Playgroud)
为了添加新的关系使用attach或sync.
两者之间的区别是:
1 attach将在数据透视表上添加新行,而不检查它是否已存在.当您将其他数据链接到该关系时,这很好,例如:
User并Exam与数据透视表链接attempts: id, user_id, exam_id, score
我想这不是你所需要的:
$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]
Run Code Online (Sandbox Code Playgroud)
2 sync,另一方面,要么删除所有关系,并设置它们重新:
$user->tasks()->getRelatedIds(); // [1,2,3,4,5,6]
$user->tasks()->sync([1,2,3]);
// then
$user->tasks()->getRelatedIds(); // [1,2,3]
Run Code Online (Sandbox Code Playgroud)
或者它将设置新关系而不分离先前的AND而不添加重复项:
$user->tasks()->sync([5,6,7,8], false); // 2nd param = detach
// then
$user->tasks()->getRelatedIds(); // [1,2,3,4,5,6,7,8]
Run Code Online (Sandbox Code Playgroud)
Mah*_*alt 94
这是我关于如何保存和更新所有Eloquent关系的笔记.
在一对一:
你必须使用HasOne上的第一款车型,并属于关联的第二个模型
在第一个模型(HasOne)上添加记录使用保存 功能
例: $post->comments()->save($comment);
在第二个模型(BelongsTo)上添加记录使用 关联功能
例: $user->account()->associate($account); $user->save();
在一对多:
你必须使用的hasMany上的第一款车型,并属于关联的第二个模型
要在第一个表(HasMany)上添加记录,请使用save 或saveMany函数
例: $post->comments()->saveMany($comments);
在第二个模型(BelongsTo)上添加记录使用 关联功能
例: $user->account()->associate($account); $user->save();
在多对多:
您必须在第一个模型上使用BelongsToMany,在第二个模型上使用 BelongsToMany
要在数据透视表上添加记录,请使用附加或同步功能
两个函数都接受单个ID或ID数组
如果记录已经存在于数据透视表上,而不同步,则附加检查
例: $user->roles()->attach($roleId);
在多态一对多:
你必须使用 MorphMany主模型和 MorphTo上的所有(***能)模型
要在所有其他模型上添加记录,请使用 保存
例: $course->tags()->save($tag);
数据透视表应包含以下列:
.主要型号ID
.(***)ID
.(***)类型
在多态多对多:
你必须使用 MorphByMany主模型和 MorphToMany上的所有(***能)模型
要在所有其他模型上添加记录,请使用save或saveMany
例: $course->tags()->save($tag);
例: $course->tags()->saveMany([$tag_1, $tag_2, $tag_3]);
数据透视表应包含以下列:
.主要型号ID
.(***)ID
.(***)类型
in Has Many Through(快捷方式):
您必须在第一个表上使用HasManyThrough,并在其他2个表上具有正常关系
这不适用于ManyToMany关系(其中有一个数据透视表)
然而,这是一个很好的解决方案.
这是我写的一篇文章,受到这个答案的启发.重要的是检查它:https: //hackernoon.com/eloquent-relationships-cheat-sheet-5155498c209
| 归档时间: |
|
| 查看次数: |
68515 次 |
| 最近记录: |