#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()
методу, так как он ожидает один экземпляр класса модели (который в данном случае является комментарием).