[解決済み] Laravel 多対多のリレーションシップの保存/更新
質問
多対多の関係を保存する方法について、どなたか教えてください。私はタスクを持っていて、ユーザーは多くのタスクを持つことができ、タスクは多くのユーザーを持つことができます(多対多)、私が達成したいのは 更新フォーム 管理者は、特定のタスクに複数のユーザーを割り当てることができます。これは、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]
関連
-
[解決済み] Laravel. リレーションを持つモデルでscope()を使用する
-
[解決済み] Laravelで「キャッシュのクリアに失敗しました。適切なパーミッションがあることを確認してください"
-
[解決済み] Laravel Eloquent - distinct() と count() が正しく動作しない。
-
[解決済み] Laravelで非キーカラムのフィールドに明確な値を取得する方法は?
-
[解決済み] パブリックディレクトリを取得するには?
-
[解決済み] Laravel Migrationsから特定のファイルをMigrateする
-
[解決済み] 2つのCarbon Timestampを比較するには?
-
[解決済み] Laravel Eloquent - 1つの行を取得する
-
[解決済み] Laravel コントローラ サブフォルダ ルーティング
-
[解決済み] コレクション要素をフェッチした後、アンセット(削除)するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Laravel. リレーションを持つモデルでscope()を使用する
-
[解決済み] Laravelで「キャッシュのクリアに失敗しました。適切なパーミッションがあることを確認してください"
-
[解決済み] Laravel Eloquent - distinct() と count() が正しく動作しない。
-
[解決済み] E: パッケージ 'mysql-client' は docker compose を使った php-fpm イメージのビルドでインストール候補がない
-
[解決済み] Laravelで非キーカラムのフィールドに明確な値を取得する方法は?
-
[解決済み] Laravel Migrationsから特定のファイルをMigrateする
-
[解決済み] 2つのCarbon Timestampを比較するには?
-
[解決済み] Laravel Eloquent - 1つの行を取得する
-
[解決済み] Laravel コントローラ サブフォルダ ルーティング
-
[解決済み] コレクション要素をフェッチした後、アンセット(削除)するには?