插入新记录或更新(如果存在)的缩写是什么?
<?php
$shopOwner = ShopMeta::where('shopId', '=', $theID)
->where('metadataKey', '=', 2001)->first();
if ($shopOwner == null) {
// Insert new record into database
} else {
// Update the existing record
}
就像在Laravel一样
例如,对于提出的问题,您可以使用以下内容:
$matchThese = ['shopId'=>$theID,'metadataKey'=>2001];
ShopMeta::updateOrCreate($matchThese,['shopOwner'=>'New One']);
上面的代码将检查ShopMeta表示的表,除非在模型本身中没有定义,否则它很可能是shop_metas
。
它将尝试使用
列shop Id=$theID
和
列metadateKey=2001
如果找到,它将把找到的行的列shop Owner
更新为New One
。
如果它找到多个匹配行,那么它将更新第一行,这意味着该行具有最低的主id
。
如果根本找不到,则将插入一个新行,其中包含:
shopId=$theID
,metadateKey=2001
和shopOwner=New
注意检查您的模型是否有
$fillable
,并确保您在其中定义了要插入或更新的每个列名,其余列具有默认值或其id
列自动递增1。
否则在执行上述示例时将抛出错误:
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中使用查询生成器。以下是Laravel docs中查询生成器的参考。
查询生成器的工作原理与雄辩的完全相同,所以任何对雄辩的东西都是对查询生成器也是如此。因此,对于这种特殊情况,只需对查询生成器使用相同的函数,如:
$matchThese = array('shopId'=>$theID,'metadataKey'=>2001);
DB::table('shop_metas')::updateOrCreate($matchThese,['shopOwner'=>'New One']);
当然,不要忘记添加DB facade:
use Illuminate\Support\Facades\DB;
或
use DB;
以防万一人们还是会遇到这个。。。我在写这篇文章几周后发现,这实际上是拉雷维尔雄辩的核心的一部分。。。
深入探讨雄辩的等效方法。你可以在这里看到:
https://github.com/laravel/framework/blob/4.2/src/Illuminate/Database/Eloquent/Model.php#L553
on:570和:553
/**
* Create or update a record matching the attributes, and fill it with values.
*
* @param array $attributes
* @param array $values
* @return static
*/
public static function updateOrCreate(array $attributes, array $values = array())
{
$instance = static::firstOrNew($attributes);
$instance->fill($values)->save();
return $instance;
}
下面是老答案
我想知道是否有任何内置的L4功能可以通过以下方式实现:
$row = DB::table('table')->where('id', '=', $id)->first();
// Fancy field => data assignments here
$row->save();
几周前我创造了这个方法。。。
// Within a Model extends Eloquent
public static function createOrUpdate($formatted_array) {
$row = Model::find($formatted_array['id']);
if ($row === null) {
Model::create($formatted_array);
Session::flash('footer_message', "CREATED");
} else {
$row->update($formatted_array);
Session::flash('footer_message', "EXISITING");
}
$affected_row = Model::find($formatted_array['id']);
return $affected_row;
}
我希望这能有所帮助。如果有人有别的选择可以分享,我很乐意看到。@erikthedev_
这里有一个“lucip”所说的完整例子:
$user = User::firstOrNew(array('name' => Input::get('name')));
$user->foo = Input::get('foo');
$user->save();
以下是最新版本Laravel上文档的更新链接
这里的文档:更新的链接
创建 var newRecord = {}; newRecord.id = 1; newRecord.name = "John" Person.create(newRecord, function(err, results) { ... }); 保存 Person.find({ surname: "Doe" }, function (err, people) { // SQL: "SEL
问题内容: 插入新记录或更新(如果存在)的快捷方式是什么? 问题答案: 这是“ lu cip”正在谈论的完整示例: 以下是Laravel最新版本上的文档更新链接 此处的文档:更新的链接
问题内容: 我想定义具有2个TIMESTAMP字段的表,如下所示: 如何避免错误: 重点是保持表架构中和的所需行为。 问题答案: 猜猜这是一个老帖子,但实际上我想mysql在其最新版本中支持2 TIMESTAMP mysql 5.6.25,这就是我目前使用的时间。
本文向大家介绍MongoDB的创建、更新和删除,包括了MongoDB的创建、更新和删除的使用技巧和注意事项,需要的朋友参考一下 概要 下面开始学习MongoDB最重要也是最基础的部分:C(创建)R(查询)U(更新)D(删除);由于R(查询)操作相对来说内容比较多,也比较繁琐, 同时使用频率也比较高,所以下一篇会拿出来单独介绍。废话不多说,连上服务器,我们直接进入正题! 一、创建 按照我
目前,我正在用一个查询检查该项是否存在,然后使用put或updateItem,我想更改它并对DDB进行一次调用。我想进行一个将更新或创建项目的查询。 下面是我的项目的一个例子: 项目类型: 如果项目存在,我想推送一个新项目,比如{papa:'dsfadsf'}(永远不要修改fa映射内的现有项目),并修改pa映射内的finish值 这是更新后的项目: 这是我尝试的,但不起作用
我有一个相当棘手的问题。 我所拥有的: