1. ホーム
  2. laravel

[解決済み] Laravel 多対多のリレーションシップの保存/更新

2022-11-09 15:09:10

質問

多対多の関係を保存する方法について、どなたか教えてください。私はタスクを持っていて、ユーザーは多くのタスクを持つことができ、タスクは多くのユーザーを持つことができます(多対多)、私が達成したいのは 更新フォーム 管理者は、特定のタスクに複数のユーザーを割り当てることができます。これは、htmlの複数選択入力によって行われます。

name="taskParticipants[]"

ここでのキャッチは、同じフォーム(入力)を通してユーザーを追加/削除できることで、それが私がsync()を使用しなければならない理由です。 多分、私は最初から始めるべきですが、どこから始めればいいのかわかりません......。

これは私のUserモデルです。

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

タスクモデル

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

タスクコントローラ

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 を2番目のパラメータ 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');
}


新しいリレーションを追加するには 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]


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]