Laravel: редактирование полей отношения один ко многим - PullRequest
0 голосов
/ 10 июня 2018

У меня есть структура таблицы, подобная этой:

id   name   superpower
 1     A      speed
 2     A      stamina
 3     B      speed
 4     C      power
 5     B      power
 6     D      sarcasm

Имя имеет отношение один-ко-многим с Супердержавой.Чтобы отредактировать эти поля, интерфейсная форма возвращает массив суперспособностей для имени.То есть форма 'edit A' может возвращать ['speed','power'] (устраняя выносливость и добавляя силы).

Простой способ сделать это с помощью чистого PHP - удалить все суперсилы имени и добавить новые.Каков наилучший способ сделать это в Laravel?

1 Ответ

0 голосов
/ 11 июня 2018

Итак, у вас есть модель User (для аутентификации), модель Kid для деталей о детях, а затем модель Superpower для деталей о сверхдержавах.

У вас есть два варианта, которые я вижу.Первый вариант требует большего структурного изменения, но более простой логики контроллера, в то время как другой более тяжелый в контроллере.

1 -

Создайте отношения «многие ко многим» с детьми и сверхдержавами.Это может не подходить к вашему случаю использования, если пользователи могут добавлять новые суперспособности, которые доступны для просмотра всем остальным пользователям.Это будет включать в себя сводную таблицу, которая будет хранить каждое соединение между ребенком и сверхдержавой.

При возврате массива сверхдержав для ссылки на ребенка (скажем, список флажков отправляется в форме), вы можете использовать метод отношений sync:

$kid->superpowers->sync($superpowers);

2 -

Если вы хотите сохранить ваши отношения в основном такими, как они есть, я рекомендую хотя бы изменить структуру таблицы, предложенную вами в вашем вопросе, чтобы поле name было kid_id.Это было бы более стандартным, так что ребенок имел бы отношение hasMany к сверхдержавам, а супердержава имела бы отношение к ребенку.

Тогда вы можете позвонить:

foreach ($request->superpowers as $superpower) {
    $superpowers[] = ['superpower' => $superpower];
}

$kid->superpowers->delete();
$kid->superpowers->createMany($superpowers);

Заметным недостатком этого подхода является то, что данные сначала удаляются для синхронизации.Полученные created_at временные метки были бы тогда неправильными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...