找回密码
 立即注册
这样更新Userusers | 软件设计/软件工程 2022-05-03 243 0star收藏 版权: . 保留作者信息 . 禁止商业使用 . 禁止修改作品
问题
如果我错了,请纠正我,但我认为雄辩的模型中不存在大规模更新。

有没有一种方法可以对数据库表进行大规模更新,而不必为每一行发出查询?

比如有没有静态方法
  1. User::updateWhere(
  2.     array('age', '<', '18'),
  3.     array(
  4.         'under_18' => 1
  5.         [, ...]
  6.     )
  7. );
复制代码

(是的,这是一个愚蠢的例子,但你明白了......)

为什么没有实现这样的功能?

如果发生这样的事情,只有我会高兴吗?

我(开发人员)不想像这样实现它:

DB::table(&amp;#39;users&amp;#39;)->where(&amp;#39;age&amp;#39;, &amp;#39;<&amp;#39;, &amp;#39;18&amp;#39;)-&amp;gt ;update(array(&amp;#39;under_18&amp;#39;=>1));

因为随着项目的发展,以后我们可能需要程序员更改表名,而他们无法搜索和替换表名!

有没有这样的静态方法来做到这一点?如果没有,我们可以扩展 Illuminate\Database\Eloquent\Model 类来完成这样的任务吗?

回答
对于批量更新/插入功能,它被要求,但 Taylor Otwell(Laravel 作者)建议用户应该使用 Query Builder。 https://github.com/laravel/framework/issues/1295

您的模型通常应该扩展 Illuminate\Database\elloquent\Model。然后访问实体本身,例如,如果您有:
  1. <?php
  2. Use Illuminate\Database\Eloquent\Model;

  3. class User extends Model {

  4.     // table name defaults to "users" anyway, so this definition is only for
  5.     // demonstration on how you can set a custom one
  6.     protected $table = 'users';
  7.     // ... code omited ...
复制代码

更新#2

您必须求助于查询生成器。为了解决表命名问题,可以通过get table()方法动态获取。唯一的限制是在使用此函数之前需要初始化用户类。您的问题如下:
  1. $userTable = (new User())->getTable();
  2. DB::table($userTable)->where('age', '<', 18)->update(array('under_18' => 1));
复制代码

这样,您的表名就是用户模型中的控制器(如上例所示)。

更新#1

另一种方法(在您的情况下效率不高)是:
  1. $users = User::where('age', '<', 18)->get();
  2. foreach ($users as $user) {
  3.     $user->field = value;
  4.     $user->save();
  5. }
复制代码

这样,表名保存在 users 类中,开发人员不必担心。





上一篇:Visual Studio Online - 无法解析版本描述符 BranchName
下一篇:如何在recyclerview中从Firebase数据库自下而上检索数据