php – 找到或创造与雄辩
我最近开始使用
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]); 用户的存在将仅通过电子邮件进行检查,但创建时,新记录将同时保存电子邮件和名称. API Docs (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |