Могу ли я иметь два условия, которые должны быть выполнены в вызове updateOrInsert?

Из чтения Документация Laravel я знаю, что updateOrInsert принимает два аргумента, первый из которых представляет собой массив условий. Этот массив сравнивается один за другим, а не все сразу - т. е. при наличии массива ['name' => 'John', 'email' => '[email protected]'] он сначала проверит строку (строки) с name == 'John', а затем, если не найдет, ищет строку (строки) с email == '[email protected]'.

Я хочу иметь два условия, которые должны быть соблюдены, т. е. он будет обновлять строки только в том случае, если у них есть name == 'John'ANDemail == '[email protected]'.

Есть ли хороший способ сделать это с помощью функции updateOrInsert, или мне нужно использовать оператор if и дополнительный вызов для проверки обоих условий?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
226
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

updateOrInsert должен вести себя так, как вы хотите, чтобы он вел себя. Первый аргумент, который он принимает, — это связный по условию массив условий. Второй параметр — это массив для объединения условий и обновления любой соответствующей записи.

    /**
     * Insert or update a record matching the attributes, and fill it with values.
     *
     * @param  array  $attributes
     * @param  array  $values
     * @return bool
     */
    public function updateOrInsert(array $attributes, array $values = [])
    {
        if (! $this->where($attributes)->exists()) {
            return $this->insert(array_merge($attributes, $values));
        }
        if (empty($values)) {
            return true;
        }
        return (bool) $this->take(1)->update($values);
    }

Код из https://github.com/laravel/framework/blob/bc31b3b22c44fcc797ad4e5a6f95f5bccdd63acc/src/Illuminate/Database/Query/Builder.php#L2699

Ответ принят как подходящий

Да, вы можете сделать это так, это уже есть в документации.

DB::table('users')
    ->updateOrInsert(
        ['email' => '[email protected]', 'name' => 'John'],
        ['votes' => '2']
    );

Он проверит email == '[email protected]' и name == 'john', а затем обновит votes=2.

Другие вопросы по теме