问题
如果我错了,请纠正我,但我认为雄辩的模型中不存在大规模更新。
有没有一种方法可以对数据库表进行大规模更新,而不必为每一行发出查询?
比如有没有静态方法
- User::updateWhere(
- array('age', '<', '18'),
- array(
- 'under_18' => 1
- [, ...]
- )
- );
复制代码
(是的,这是一个愚蠢的例子,但你明白了......)
为什么没有实现这样的功能?
如果发生这样的事情,只有我会高兴吗?
我(开发人员)不想像这样实现它:
DB::table(&#39;users&#39;)->where(&#39;age&#39;, &#39;<&#39;, &#39;18&#39;)-&gt ;update(array(&#39;under_18&#39;=>1));
因为随着项目的发展,以后我们可能需要程序员更改表名,而他们无法搜索和替换表名!
有没有这样的静态方法来做到这一点?如果没有,我们可以扩展 Illuminate\Database\Eloquent\Model 类来完成这样的任务吗?
回答
对于批量更新/插入功能,它被要求,但 Taylor Otwell(Laravel 作者)建议用户应该使用 Query Builder。 https://github.com/laravel/framework/issues/1295
您的模型通常应该扩展 Illuminate\Database\elloquent\Model。然后访问实体本身,例如,如果您有:
- <?php
- Use Illuminate\Database\Eloquent\Model;
- class User extends Model {
- // table name defaults to "users" anyway, so this definition is only for
- // demonstration on how you can set a custom one
- protected $table = 'users';
- // ... code omited ...
复制代码
更新#2
您必须求助于查询生成器。为了解决表命名问题,可以通过get table()方法动态获取。唯一的限制是在使用此函数之前需要初始化用户类。您的问题如下:
- $userTable = (new User())->getTable();
- DB::table($userTable)->where('age', '<', 18)->update(array('under_18' => 1));
复制代码
这样,您的表名就是用户模型中的控制器(如上例所示)。
更新#1
另一种方法(在您的情况下效率不高)是:
- $users = User::where('age', '<', 18)->get();
- foreach ($users as $user) {
- $user->field = value;
- $user->save();
- }
复制代码
这样,表名保存在 users 类中,开发人员不必担心。
|