Сохраните или создайте новую запись, если она еще не существует, используя Eloquent - PullRequest
0 голосов
/ 27 марта 2020

Я рекурсивно вызываю функцию, которая вставляет новые записи в БД, а также удаляет из БД в некоторой ее части. Чтобы лучше понять меня, я предоставляю свою функцию:

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() для такой проблемы?

Ответы [ 2 ]

0 голосов
/ 27 марта 2020

Если я правильно понимаю, вам нужен красноречивый метод updateOrCreate,

Вы также можете столкнуться с ситуациями, когда вы хотите обновить существующую модель или создать новая модель, если не существует . Laravel предоставляет метод updateOrCreate для выполнения этого за один шаг. Как и метод firstOrCreate, updateOrCreate сохраняет модель, поэтому не нужно вызывать save () :

// If there's a flight from Oakland to San Diego, set the price to $99.
// If no matching model exists, create one.
$flight = App\Flight::updateOrCreate(
  ['departure' => 'Oakland', 'destination' => 'San Diego'],
  ['price' => 99, 'discounted' => 1]
);

Как это работает?:

App\YourModel::updateOrCreate(
  param1,
  param2
);

Если все ключи и значения в param1(Array) совпадают, эта строка будет обновлена ​​на param2 key => значения (не нужно повторять значения ключа param1 для param2), в противном случае A Будет создана новая строка.

0 голосов
/ 27 марта 2020

Вы можете использовать метод updateOrCreate, указанный в laravel.

Пример : если есть рейс из Окленда в Сан D iego, установите цену на $ 99. Он создаст новый, если не существует.

$flight = App\Flight::updateOrCreate(
     ['departure' => 'Oakland', 'destination' => 'San Diego'],
     ['price' => 99, 'discounted' => 1] );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...