2014-11-04 4 views

ответ

0

Я не знаю, как сделать это с Fluent помимо использования DB::raw(), но Eloquent имеет firstOrNew()

// Gets a user with fname of 'john' and lname of 'smith' or creates a new model and sets these properties. 
$user = User::firstOrNew(['fname' => 'john', 'lname' => 'smith']); 

// Lets say you want to activate john smith 
$user->activated = true; 

// Saves the new model or existing model (whatever it was) 
$user->save(); 
0

Вот код, я использую в статическом functon моей \ App \ Model к добавьте несколько значений с игнорированием вставки. Этот код является компиляцией различных ответов, которые я встречал в StackOverflow.

Протестировано и работает на Laravel 5.6 с PHP 7.1.3

$keys = ['column1', 'column2', 'column3']; 

foreach ($whatever as $result) { 
    $banban = []; 
    $banban[] = $result->value1; 
    $banban[] = $result->value2; 
    $banban[] = $result->value3; 

    $values[] = $banban; 
} 

return DB::insert(
    'INSERT IGNORE INTO ' . with(new self)->getTable() . 
    '(' . implode(',', $keys) . ') values ' . 
    substr(str_repeat('(?' . str_repeat(',?', count($keys) - 1) . '),', count($values)), 0, -1), 
    array_merge(...$values) 
); 

Некоторые пояснения:

with(new self) возвращает новый экземпляр модели. Это простой способ получить имя таблицы модели в статической функции.

substr(...,0,-1) используется для удаления последней запятой из «значений»

str_repeat используется дважды, чтобы создать «(?,?,?)» Заполнители и «?» внутри.

array_merge(...$values) flatters массив значений. Вот почему $values не может иметь пользовательские ключи.

Надеюсь, это поможет.

Смежные вопросы