Laravel Eloquent массовое обновление, обеспечить уникальность - PullRequest
0 голосов
/ 24 марта 2020

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

У меня есть модель Course, и я хочу позволить пользователям API массово обновлять детали каждого курса. Я создал хороший интерфейс, где пользователи могут редактировать детали, как в Excel. Внешний интерфейс отправляет запрос PUT в мой API с новыми значениями для каждого курса. Таблица Course выглядит следующим образом:

+------------+------------+------------+------------+---------------------+---------------------+
| id         | name       | abbrev     | owner_id   | created_at          | updated_at          |
+------------+------------+------------+------------+---------------------+---------------------+
| 1          | Math B     | MB         | 1          | 2020-01-01 10:00:00 | 2020-01-01 10:00:00 |
| ...        | ...        | ...        | ...        | ...                 | ...                 |
+------------+------------+------------+------------+---------------------+---------------------+

Теперь я хочу иметь в виду несколько требований:

  • Имя Course и сокращение оба должны быть УНИКАЛЬНЫМИ (не исполняемыми MySQL, но деловыми требованиями).
  • Отправленный пользователем запрос PUT содержит не все записи, а только те записи, которые фактически были изменены пользователем.
  • Либо все в запросе PUT должно быть обновлено, либо ничего не должно быть обновлено (и возвращена ошибка, выходящая за рамки этого вопроса).

Теперь проблема в :
Как я могу обеспечить УНИКАЛЬНОСТЬ этих двух полей без фактического внесения каких-либо изменений, пока я точно не буду знать, что УНИКАЛЬНОСТЬ поддерживается?

Я думал об использовании транзакций для первой «постановки» всех изменений, затем запросить УНИКАЛЬНОСТЬ обоих полей и затем зафиксировать или откатить, это хороший подход? Любые предложения для другого? Кто-нибудь может дать мне какие-нибудь советы о том, как выполнять транзакции в сочетании с Eloquent Query Builder?

Второй подход, о котором я думал, это сначала извлечь все записи из базы данных, внеся изменения в возвращаемую коллекцию, каким-то образом проверьте УНИКАЛЬНОСТЬ, если УНИКАЛЬНОСТЬ гарантирована, выбросьте все, что не изменилось, и сохраните все, что было изменено. Проблема этого подхода заключается в том, что записи базы данных возвращаются как Collection из Course объектов, а данные PUT - это массив StdObj объектов, поэтому несовместимы для прямых операций. Есть идеи по этому поводу?

Спасибо!

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