我想更新我的记录(如果存在),但如果不存在则创建新记录。这是我到目前为止:
MerchantBranch.php
public function token()
{
return $this->hasOne('App\MerchantBranchToken');
}
MerchantBranchToken.php
public function merchant_branch()
{
return $this->belongsTo('App\MerchantBranch');
}
$find = MerchantBranchToken::find($id);
if (!$find) {
$branch = new MerchantBranchToken(['token' => $token]);
MerchantBranch::find($id)->token()->save($branch);
} else {
$find->token = $token;
$find->save();
}
它完美运作。
但据我所知,Laravel对其雄辩的模型非常强大。 我能缩短一下吗?或者我已经正确地做了?。
我已尝试使用" updateOrCreate"方法,但我的外键" merchant_branch_id"需要可填写。
答案 0 :(得分:8)
Laravel为此目的提供方法updateOrCreate
如果有从奥克兰飞往圣地亚哥的航班,请将价格定为99美元。
如果不存在匹配的模型,请创建一个。
$flight = App\Flight::updateOrCreate(
['departure' => 'Oakland', 'destination' => 'San Diego'],
['price' => 99]
);
答案 1 :(得分:6)
Laravel已经通过save
函数
$user->save()
// 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);
}
https://github.com/laravel/framework/blob/5.1/src/Illuminate/Database/Eloquent/Model.php#L1491
->exists
所有laravel模型都有->exists
属性。
更具体地说,如果模型是从数据库加载的,或者自创建以来已保存到数据库,则exists
属性将为true;否则就是假的。
如果您了解->exists
可以使用它,但这是处理此类要求的另一种方法。
/**
* 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;
}
答案 2 :(得分:0)
添加新功能代码:
vendor / laravel / framework / src / Illuminate / Database / Eloquent / Builder.php:
public function updateOrInsert(array $attributes, array $values = [])
{
$instance = $this->where($attributes);
if ($instance->count() != 0) {
$instance->update($values);
} else {
$instance = $this->updateOrCreate($attributes, $values);
}
return $instance;
}