Laravel обновление нескольких отношений hasMany / belongsToMany

#php #laravel #eloquent

#php #laravel #красноречивый

Вопрос:

Я унаследовал проект, который имеет несколько грубых форм … В форме создания нам нужно создать записи для hasMany belongsToMany отношения и . Итак, в основном то, что я получил, это следующее

 $movie = Movie::create($request->validated());

// Then to save the belongsToMany
foreach ($request['actors'] as $actor) {
  // do some data manipulation

  $actor = Actor::where('code', $actor->code)->first();

  $movie->actors()->attach($actor);
}

// Save the hasMany 
foreach ($request['comments'] as $comment) {
  // do some data manipulation

  $movie->comments()->create([
    'title' => $comment['title'],
    'body' => $comment['body'],
  ]);
}

 

Я не уверен, что это лучший способ сделать это, но, похоже, это работает.

Проблема, с которой я столкнулся, заключается в том, что в edit форме эти участники / комментарии могут быть отредактированы, добавлены или удалены, и я не уверен, как их обновить. Можно ли их обновить, или было бы лучше удалить существующие данные о взаимоотношениях и повторно добавить их?

Я никогда не обновлял отношения, только добавлял их, поэтому я даже не уверен, с чего начать.

Любая помощь была бы очень признательна.

Ответ №1:

Как было предложено в документе laravel, вы можете использовать saveMany() метод для хранения экземпляров отношений.

 // Save the hasMany 
foreach ($request['comments'] as $comment) {
  
  $comments[] = [
    new Comment([
      'title' => $comment['title'],
      'body' => $comment['body'],
    ]);  
  ];
}

!empty($comments) amp;amp; $movie->comments()->saveMany($comments);
 

Для удаления и обновления вы должны определить два маршрута: один для обновления комментария и один для удаления комментария.

 Route::patch('movie/{movie}/comment/{comment}',[MovieController::class,'updateComment']);
Route::delete('movie/{movie}/comment/{comment}',[MovieController::class,'deleteComment']);
 

Комментарии:

1. Привет, спасибо за это… У меня есть маршрут обновления в моем контроллере ресурсов, но я не уверен how , как обновить отношения

2. Что-то вроде $movie->comments()->where('id', $comment->id)->update(['title'=>'new title']); ?

3. Я получаю сообщение об ошибке с saveMany, аргумент 1 передается в IlluminateDatabaseEloquentRelationsHasOneOrMany::save() должен быть экземпляром IlluminateDatabaseEloquentModel, заданный массив

4. @CodeSauce Если вы сохраняете только один комментарий, вам следует использовать save() , а если вы хотите сохранить много комментариев в одной строке, вам следует использовать saveMany() . Вы не можете передать массив комментариев save() методу, так как он ожидает один экземпляр класса модели (который в данном случае является комментарием).