4

В одном из моих рабочих сценариев для хранения счетчиков агрегатов на основе некоторых показателей я не использую Eloquent, так как запросы немного сложны и их легко написать с помощью построителя запросов. В настоящее время я получаю значения из базы данных, и мне нужно вставить/обновить их в базе данных. Можно ли выполнить операцию upsert с помощью метода save(), используя Query Builder? Или мне нужно каждый раз проверять, находится ли эта запись в базе данных?Laravel активирует операции с Query Builder

У меня есть в общей сложности 100 000 записей и вы хотите запускать его как ежедневную работу. Поэтому, если мне нужно проверить, существует ли конкретная запись в БД, мне нужно многократно обращаться к базе данных. Есть ли альтернативное решение для этого?

Я думаю о создании двух классов моделей, один из которых использует Eloquent, а другой - с помощью построителя запросов. Могу ли я использовать свой пользовательский запрос в модели Eloquent?

ответ

3

Eloquent имеет метод updateOrCreate(), который позволяет делать именно то, что вы хотите. Но Query Builder не имеет аналогичного метода.

Вы можете построить необработанный запрос с помощью Query Builder и использовать INSERT ... ON DUPLICATE KEY UPDATE в качестве решения upsert.

+1

Помните, что 'updateOrCreate' не так атомно, как SQL upsert: https://github.com/illuminate/database/blob/2656d7a7118a6d9fe1f8c9ed22d65ab609b8ae1d/Eloquent/Builder.php#L391. Он выбирает сначала, затем вставляет или обновляет, что может быть подвержено условиям гонки. –