Оновлення 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
це не ваш основний ключ, правда?