Я рекурсивно вызываю функцию, которая вставляет новые записи в БД, а также удаляет из БД в некоторой ее части. Чтобы лучше понять меня, я предоставляю свою функцию:
public function updateUserMailQueue($data, $user_id) {
if(!array_key_exists('mail_queue', $data)) return;
$queues = preg_replace('/[^0-9,]/', '', $data['mail_queue']);
$queues = explode(',', $queues);
sort($queues);
foreach($queues as $queue) {
if(empty($queue)) continue;
$existing = MailQueue::zQuery()->where('order', $queue)->first();
if(empty($existing)) {
$existing = new MailQueue();
$existing->order = $queue;
} else if($existing->user_id != $user_id) {
$this->updateUserMailQueue(['mail_queue' => $existing->order + 1], $existing->user_id);
}
$existing->user_id = $user_id;
$existing->save();
}
MailQueue::zQuery()->where('user_id', $user_id)->whereNotIn('order', $queues)->delete();
}
Что я пытаюсь достичь, с помощью этой функции - создать порядок приоритетов, по которому почта будет отправляться пользователю (более низкий номер с более высоким приоритетом) , Причина, по которой я использую рекурсию, заключается в том, что если порядок изменяется, поэтому пользователь с приоритетом 4 становится равным 1, мне нужно изменить порядок приоритетов для всех остальных пользователей. Проблема, с которой я сталкиваюсь в функции, написанной так, как сейчас, последняя строка в функции удаляет $existing
запись, которая была назначена в вызове ранее, поэтому, как только она возвращается к этому вызову, вызываются следующие две строки:
$existing->user_id = $user_id;
$existing->save();
но поскольку $existing
запись больше не существует в таблице, ничего не сохраняется, но также не выдается ошибка. Теперь я хотел бы знать, есть ли способ сделать что-то вроде ->saveOrCreate()
вместо ->save()
для такой проблемы?