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]
);
который в значительной степени очищает все.
Обновление Query Builder
Кто-то спросил, возможно ли использовать Query Builder в Laravel. Вот ссылка на Query Builder из документов Laravel.
Query Builder работает точно так же, как Eloquent, поэтому все, что верно для Eloquent, также верно и для Query Builder. Так что для этого конкретного случая, просто используйте ту же функцию с вашим построителем запросов, например, так:
$matchThese = array('shopId'=>$theID,'metadataKey'=>2001);
DB::table('shop_metas')::updateOrCreate($matchThese,['shopOwner'=>'New One']);
Конечно, не забудьте добавить фасад БД:
use Illuminate\Support\Facades\DB;
ИЛИ
use DB;
Я надеюсь, что это помогает
shopId
это не твой первичный ключ, верно?