我最近开始使用
Laravel和
Eloquent,并且想知道模型是否缺少查找或创建选项.你可以随时写,例如:
$user = User::find($id); if (!$user) { $user = new User; }
但是,没有更好的方法来寻找或创造?在这个例子中似乎是微不足道的,但对于更复杂的情况来说,要真正有助于获取现有记录并进行更新或创建新记录.
以下是原来接受的答案:
laravel-4
在Laravel中已经有一个findOrFail方法,当使用这种方法时,它会在失败时抛出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; }
从您的控制器,您可以使用
$user = User::findOrCreate(5); $user->first_name = 'Jhon'; $user->last_name = 'Doe'; $user->save();
如果id为5的用户是exixts,那么它将被更新,否则将创建一个新用户,但id将为last_user_id 1(自动递增).
这是另一种做同样的事情:
public function scopeFindOrCreate($query,$id) { $obj = $query->find($id); return $obj ?: new static; }
您可以在Model中使用一个范围,而不是创建一个静态方法,因此Model中的方法将是scopeMethodName并调用Model :: methodName(),与静态方法相同,例如
$user = User::findOrCreate(5);
更新:
第一个OreCreate在Laravel 5x中可用,答案太旧了,它在2013年被授予Laravel-4.0.
在Laravel 5.3中,firstOrCreate方法具有以下声明:
public function firstOrCreate(array $attributes,array $values = [])
这意味着你可以这样使用它:
User::firstOrCreate(['email' => $email],['name' => $name]);