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






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);
}
Да, вы можете сделать это так, это уже есть в документации.
DB::table('users')
->updateOrInsert(
['email' => '[email protected]', 'name' => 'John'],
['votes' => '2']
);
Он проверит email == '[email protected]' и name == 'john', а затем обновит votes=2.