Оновлення 2020 року
Як і у Laravel> = 5.3 , якщо комусь все ще цікаво, як це зробити простим способом. Його можна з допомогою: updateOrCreate().
Наприклад, для заданого питання ви можете використовувати щось на кшталт:
$matchThese = ['shopId'=>$theID,'metadataKey'=>2001];
ShopMeta::updateOrCreate($matchThese,['shopOwner'=>'New One']);
Вищевказаний код перевірятиме таблицю, представлену ShopMeta, яка, швидше за все, shop_metasне буде визначена в самій моделі
і він спробує знайти запис із
стовпчик shopId = $theID
і
стовпчик metadateKey = 2001
і якщо він знайде, він оновить стовпець shopOwnerзнайденого рядка до New One.
Якщо він знайде більше, ніж один рядок, що збігається, він оновить перший перший рядок, що означає, що має найнижчий рівень первинного id.
Якщо його взагалі не знайдено, він вставить новий рядок із:
shopId = $theID, metadateKey = 2001іshopOwner = New One
Примітка.
Перевірте свою модель $fillableта зверніть на позов про те, що там визначено кожне ім’я стовпця, яке ви хочете вставити чи оновити, а стовпці відпочинку мають або значення за замовчуванням, або його idстовпець автоматично збільшується.
Інакше він видасть помилку під час виконання вищевказаного прикладу:
Illuminate\Database\QueryException with message 'SQLSTATE[HY000]: General error: 1364 Field '...' doesn't have a default value (SQL: insert into `...` (`...`,.., `updated_at`, `created_at`) values (...,.., xxxx-xx-xx xx:xx:xx, xxxx-xx-xx xx:xx:xx))'
Оскільки було б поле, якому знадобиться значення під час вставки нового рядка, і це буде неможливо, оскільки або його не визначено, $fillableабо воно не має значення за замовчуванням.
Докладніше див. У Документації щодо Laravel за адресою:
https://laravel.com/docs/5.3/eloquent
Одним із прикладів є:
// 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]
);
що в значній мірі все очищає.
Оновлення запиту Builder
Хтось запитав, чи можна використовувати Query Builder в Laravel. Ось посилання на Builder запитів від документів Laravel.
Query Builder працює точно так само, як і красномовний, тому все, що відповідає красномовному, відповідає і Builder запитів. Тож для цього конкретного випадку просто використовуйте ту саму функцію з конструктором запитів, як:
$matchThese = array('shopId'=>$theID,'metadataKey'=>2001);
DB::table('shop_metas')::updateOrCreate($matchThese,['shopOwner'=>'New One']);
Звичайно, не забудьте додати фасад БД:
use Illuminate\Support\Facades\DB;
АБО
use DB;
Я сподіваюся, що це допомагає
shopIdце не ваш основний ключ, правда?