创建和更新 Laravel Eloquent

插入新记录或更新(如果存在)的简写是什么?

<?php

$shopOwner = ShopMeta::where('shopId', '=', $theID)
    ->where('metadataKey', '=', 2001)->first();

if ($shopOwner == null) {
    // Insert new record into database
} else {
    // Update the existing record
}

答案 1

以下是“lu cip”所谈论的完整示例:

$user = User::firstOrNew(array('name' => Input::get('name')));
$user->foo = Input::get('foo');
$user->save();

以下是最新版本的Laravel文档的更新链接

此处的文档:更新的链接


答案 2

2020年更新

就像在Laravel > = 5.3中一样,如果有人仍然很好奇如何以简单的方式做到这一点,则可以使用:.updateOrCreate()

例如,对于所问的问题,您可以使用如下内容:

$matchThese = ['shopId'=>$theID,'metadataKey'=>2001];
ShopMeta::updateOrCreate($matchThese,['shopOwner'=>'New One']);

上面的代码将检查ShopMeta表示的表,除非在模型本身中没有另行定义,否则很可能是这样。shop_metas

它会尝试找到入口

shopId = $theID

metadateKey = 2001

如果找到,则会将找到的行的列更新为 。shopOwnerNew One

如果它找到多个匹配的行,那么它将更新第一行,这意味着它具有最低的主行。id

如果根本没有找到,那么它将插入一个新行,其中包含:

shopId = $theIDmetadateKey = 2001shopOwner = New One

通知检查模型,并确保在其中定义了要插入或更新的每个列名,并且其余列具有默认值或其列自动递增的默认值。$fillableid

否则,在执行上述示例时,它将引发错误:

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;

推荐