Laravel保存/更新多对多的关系

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)

为了添加新的关系使用attachsync.

两者之间的区别是:

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

UserExam与数据透视表链接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)

  • 如果在主文档而不是API文档中记录了它会很好!摇滚.+1. (7认同)

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

.(***)类型


多态多对多:

你必须使用  MorphBy​​Many主模型和  MorphToMany上的所有(***能)模型

要在所有其他模型上添加记录,请使用savesaveMany

例:    $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