cha*_*eyh 27 php laravel eloquent laravel-4
我最近开始与工作Laravel和口才,和不知道的是,缺乏一个查找或创建模型选项.你总是可以写,例如:
$user = User::find($id);
if (!$user) {
$user = new User;
}
Run Code Online (Sandbox Code Playgroud)
但是,有没有更好的方法来查找或创建?看来在这个例子中微不足道,但对于更复杂的情况下,这将是非常有益要么让现有的记录并更新或创建一个新的.
The*_*pha 58
以下是最初接受的答案:laravel-4
已有一种方法findOrFail
可供使用Laravel
,当使用此方法时,它会抛出ModelNotFoundException
失败,但在您的情况下,您可以通过在模型中创建方法来执行此操作,例如,如果您有User
模型,则只需将此函数放入模型中
// Put this in any model and use
// Modelname::findOrCreate($id);
public static function findOrCreate($id)
{
$obj = static::find($id);
return $obj ?: new static;
}
Run Code Online (Sandbox Code Playgroud)
从您的控制器,您可以使用
$user = User::findOrCreate(5);
$user->first_name = 'John';
$user->last_name = 'Doe';
$user->save();
Run Code Online (Sandbox Code Playgroud)
如果具有id
od 的用户5
是exixts,那么它将被更新,否则将创建新用户但是id
将last_user_id + 1
(自动递增).
这是另一种做同样事情的方法:
public function scopeFindOrCreate($query, $id)
{
$obj = $query->find($id);
return $obj ?: new static;
}
Run Code Online (Sandbox Code Playgroud)
而不是创建一个静态方法,你可以使用一个scope
示范,让法的Model
将是scopeMethodName
和呼叫Model::methodName()
,和你一样的静态方法一样,例如
$user = User::findOrCreate(5);
Run Code Online (Sandbox Code Playgroud)
该firstOrCreate
是可用的Laravel 5x
,答案是太旧,它被赋予了Laravel-4.0
在2013
.
在Laravel 5.3中,该firstOrCreate
方法具有以下声明:
public function firstOrCreate(array $attributes, array $values = [])
Run Code Online (Sandbox Code Playgroud)
这意味着您可以像这样使用它:
User::firstOrCreate(['email' => $email], ['name' => $name]);
Run Code Online (Sandbox Code Playgroud)
用户的存在将仅通过电子邮件进行检查,但在创建时,新记录将保存电子邮件和姓名.
Oli*_*ria 27
或者,在这种情况下,您还可以使用Laravel的函数并搜索id作为属性,即
$user = User::firstOrCreate(['id' => $id]);
Run Code Online (Sandbox Code Playgroud)
Pet*_*uck 10
Laravel 4型号具有内置findOrNew
方法,可满足您的需求:
$user = User::findOrNew($id);
Run Code Online (Sandbox Code Playgroud)
在Laravel 5中:
您可以使用两种方法通过批量分配属性来创建模型:firstOrCreate
和firstOrNew
.
该firstOrCreate
方法将尝试使用给定的列/值对定位数据库记录.如果在数据库中找不到该模型,则将插入具有给定属性的记录.
该firstOrNew
方法firstOrCreate
将尝试在与给定属性匹配的数据库中查找记录.但是,如果未找到模型,则将返回新的模型实例.请注意,返回的模型firstOrNew
尚未保留到数据库中.您需要手动调用save来保存它:
// Retrieve the flight by the attributes, or create it if it doesn't exist...
$flight = App\Flight::firstOrCreate(['name' => 'Flight 10']);
// Retrieve the flight by the attributes, or instantiate a new instance...
$flight = App\Flight::firstOrNew(['name' => 'Flight 10']);
Run Code Online (Sandbox Code Playgroud)
根据主键ID查找或新建
$user = User::findOrNew($id); // if exist then update else insert
$user->name= $data['full_name'];
$user->save();
Run Code Online (Sandbox Code Playgroud)
基于非主要单一字段的First或New
// get the record where field_name=value else insert new record
$user = User::firstOrNew(['field_name'=>'value']);
$user->name= $data['full_name'];
$user->save();
Run Code Online (Sandbox Code Playgroud)
First或New基于非主键多字段
// get the record where field_name1=value1 and field_name2=value2, else insert new record
$user = User::firstOrNew(['field_name1'=>'value1','field_name2'=>'value2']);
$user->name= $data['full_name'];
$user->save();
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
60472 次 |
最近记录: |