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]
);
这几乎清除了一切。
查询生成器更新
有人问是否可以在Laravel中使用Query Builder。以下是来自Laravel文档的查询构建器的参考。
Query Builder 的工作方式与 Eloquent 完全相同,因此对于 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;