插入新记录或更新(如果存在)的快捷方式是什么?
<?php
$shopOwner = ShopMeta::where('shopId', '=', $theID)
->where('metadataKey', '=', 2001)->first();
if ($shopOwner == null) {
// Insert new record into database
} else {
// Update the existing record
}
插入新记录或更新(如果存在)的快捷方式是什么?
<?php
$shopOwner = ShopMeta::where('shopId', '=', $theID)
->where('metadataKey', '=', 2001)->first();
if ($shopOwner == null) {
// Insert new record into database
} else {
// Update the existing record
}
Answers:
这是“ lu cip”正在谈论的完整示例:
$user = User::firstOrNew(array('name' => Input::get('name')));
$user->foo = Input::get('foo');
$user->save();
以下是Laravel最新版本上的文档更新链接
此处的文档:更新的链接
updateOrCreate
内置于核心...]以防万一人们仍然遇到这个问题...我在写这篇文章后几周发现,这实际上是Laravel Eloquent核心的一部分...
探究Eloquent的等效方法。您可以在这里看到:
https://github.com/laravel/framework/blob/4.2/src/Illuminate/Database/Eloquent/Model.php#L553
在: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_
ModelName::firstOrNew(['param' => 'condition'])->fill(Input::get())->save();
应该做。
就像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
。
如果找到多个匹配行,则它将更新第一行,这意味着该行具有最低的primary 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中使用查询生成器。这里是Laravel文档中Query Builder的参考。
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;
希望对您有所帮助
保存功能:
$shopOwner->save()
已经做了你想要的...
Laravel代码:
// If the model already exists in the database we can just update our record
// that is already in this database using the current IDs in this "where"
// clause to only update this model. Otherwise, we'll just insert them.
if ($this->exists)
{
$saved = $this->performUpdate($query);
}
// If the model is brand new, we'll insert it into our database and set the
// ID attribute on the model to the value of the newly inserted row's ID
// which is typically an auto-increment value managed by the database.
else
{
$saved = $this->performInsert($query);
}
firstOrNew
如果不存在,将创建记录,如果已经存在,将更新行。您也可以updateOrCreate
在这里使用完整示例
$flight = App\Flight::updateOrCreate(
['departure' => 'Oakland', 'destination' => 'San Diego'],
['price' => 99]
);
如果有从奥克兰飞往圣地亚哥的航班,请将价格设置为$ 99。如果不存在,请创建新行
参考文档在这里:(https://laravel.com/docs/5.5/eloquent)
如果您需要使用来提供相同的功能DB
,请在Laravel >= 5.5
中使用:
DB::table('table_name')->updateOrInsert($attributes, $values);
或简写版本,当$attributes
和$values
相同时:
DB::table('table_name')->updateOrInsert($values);
与firstOrCreate方法一样,updateOrCreate可以持久化模型,因此无需调用save()
// 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]
);
还有你的问题
$shopOwner = ShopMeta::updateOrCreate(
['shopId' => $theID, 'metadataKey' => '2001'],
['other field' => 'val' ,'other field' => 'val', ....]
);
实际上,如果DB中已经存在该寄存器,则firstOrCreate不会更新。我改进了Erik的解决方案,因为我实际上需要更新一个表,该表不仅对于“ id”列具有唯一值
/**
* If the register exists in the table, it updates it.
* Otherwise it creates it
* @param array $data Data to Insert/Update
* @param array $keys Keys to check for in the table
* @return Object
*/
static function createOrUpdate($data, $keys) {
$record = self::where($keys)->first();
if (is_null($record)) {
return self::create($data);
} else {
return self::where($keys)->update($data);
}
}
然后,您将像这样使用它:
Model::createOrUpdate(
array(
'id_a' => 1,
'foo' => 'bar'
), array(
'id_a' => 1
)
);
就像上面发布的@JuanchoRamone(感谢@Juancho),这对我来说非常有用,但是如果您的数据是数组,则应进行如下修改:
public static function createOrUpdate($data, $keys) {
$record = self::where($keys)->first();
if (is_null($record)) {
return self::create($data);
} else {
return $record->update($data);
}
}
这与updateOrCreate()不同吗?
它相似但不相同。updateOrCreate()一次只能工作一行,不允许批量插入。InsertOnDuplicateKey将在许多行上工作。
检查用户是否存在。如果没有插入
$exist = DB::table('User')->where(['username'=>$username,'password'=>$password])->get();
if(count($exist) >0) {
echo "User already exist";;
}
else {
$data=array('username'=>$username,'password'=>$password);
DB::table('User')->insert($data);
}
Laravel 5.4
shopId
不是你的主键吧?