Laravel обновить или удалить в sql поле множественного выбора - PullRequest
0 голосов
/ 23 января 2020

У меня есть опция множественного выбора на моем веб-сайте.

<select multiple name="genres[]">
<option value="1">action</option>
<option value="2">adult</option>
<option value="3">advanture</option>
<option value="4">anime</option>
<option value="5">biographic</option>
</select>

Также у меня есть поля в db-шоу

id  name
1   grey's anatomy
2   the morning show

жанры

id  name
1   action
2   adult
3   advanture
3   anime
5   biographic

data_show_genres

id  show_id   genre_id
1   1         4
2   1         2
3   2         1

После кнопки «Отправить» функция do

foreach ($input['genres'] as $genre) {
 DataShowGenres::updateOrCreate(
   ['show_id' => $id, 'genre_id' => $genre]
 );
}

Таким образом, добавляются работы, но когда я пытаюсь удалить, я имею в виду отмена выбора некоторых данных. Старый все еще остается. Я всегда могу удалить старые данные для этого шоу, но есть ли способ сделать это лучше?

Редактировать: Контроллер:

public function edit_update(Request $request, $id)
    {
        $request->validate([
            'title'     => 'required|min:1|max:300',
            'imdb'      => 'required|min:0|max:10000000|numeric',
            'tvdb'      => 'required|min:0|max:10000000|numeric',
            'youtube'   => 'nullable|url',
            'hidden'    => 'nullable',
        ]);
        $input = $request->all();
        $input['hidden']    = $request->has('hidden') ? 1 : 0;
        $input['recommend'] = $request->has('recommend') ? 1 : 0;
        if (empty($input["genres"])) {
        } else {
            foreach ($input['genres'] as $genre) {
                $zanr = DataShowGenres::updateOrCreate(
                    ['show_id' => $id, 'genre_id' => $genre]
                );
            }
        }
        $serija              = Serija::FindOrFail($id_serije);
        $serija->title       = $input['title'];
        $serija->imdb        = $input['imdb'];
        $serija->tvdb        = $input['tvdb'];
        $serija->imdb_rating = $input['imdb_rating'];
        $serija->tmdb        = $input['tmdb'];
        $serija->hidden      = $input['hidden'];
        $serija->youtube     = $input['youtube'];
        $serija->save();
        toast('Edited!', 'success');
        return back();
    }

Маршрут:

Route::get('/serije/izmeni/{id}/{slug}', 'SerijeController@edit')->where(['id' => '[0-9]+', 'title' => '^[a-z0-9]+(?:-[a-z0-9]+)*$'])->middleware('permission:show_edit');
Route::post('/serije/izmeni/{id}/{slug}', 'SerijeController@edit_update')->where(['id' => '[0-9]+', 'naziv' => '^[a-z0-9]+(?:-[a-z0-9]+)*$'])->middleware('permission:show_edit');

1 Ответ

1 голос
/ 23 января 2020

Синхронизация ассоциаций

Вы можете использовать метод syn c для построения ассоциаций «многие ко многим». Метод syn c принимает массив идентификаторов для размещения в промежуточной таблице. Любые идентификаторы, которых нет в данном массиве, будут удалены из промежуточной таблицы. Таким образом, после завершения этой операции в промежуточной таблице будут существовать только идентификаторы в данном массиве:

//...
$show = Show::findOrFail($id);
$show->genres()->sync($input['genres']);
//...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...