Я ломал голову над этим в течение хорошего дня теперь. Надеюсь, что кто-нибудь может помочь мне с этим.
У меня есть модель 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
объектов, поэтому несовместимы для прямых операций. Есть идеи по этому поводу?
Спасибо!