Laravel4:块函数不适用于模型保存()

Posted

技术标签:

【中文标题】Laravel4:块函数不适用于模型保存()【英文标题】:Laravel4: Chunk function not working with model save() 【发布时间】:2015-03-21 09:56:27 【问题描述】:

我有一个查询来选择所有用户并对密码进行哈希处理并保存该模型。因为数据库中有大量数据而超时,所以我想我会尝试使用 chunk() 函数。我的查询看起来像,

    $users = User::where('password','!=','0')->select(array('password'))->chunk(50,function($users)
        foreach ($users as $user) 
            $user->password = Hash::make($user->password);
            $user->save();
        
     );

这不会保存模型。当我尝试在save() 之后转储$user 变量时,它会显示更新的值,但是当我查看数据库时它仍然没有改变。我尝试使用try catchtransaction 只是为了查看它在此过程中是否遇到任何异常,但没有任何帮助。任何帮助将不胜感激。另外,我在 password 字段上没有 $guarded。

【问题讨论】:

为什么不Hash创建用户时的密码?在数据库中(在任何时候)使用非散列密码似乎是个坏主意...... 我在创建用户时这样做。我这样做是因为我正在进行的项目即将上线,并且该项目最初是纯 php 的,因此从未对密码进行哈希处理。 你还应该给哈希加盐。除非你为索尼工作:-) 我相信 Laravel 4 已经使用了盐。此外,当我尝试使用 wherebetween 查询而不是使用 chunk() 函数对密码进行哈希处理时,大量更新正在工作。我不能使用以前的方法,因为我将在实时环境中,并且我不想每次都去文件以更改 wherebetween 中的 id。您对chunk() 功能有任何解决方案吗?或任何其他我可以一次批量更新密码的方法? 【参考方案1】:

你只是做错了。你能告诉在那个循环中应该更新哪一行吗?不? Eloquent 也不知道,所以它运行 update ... where id is null ;)

只需将id 添加到select 子句,它就会起作用(除非您在saving 事件等中发生了一些神奇的事情):

$users = User::where('password','!=','0')
  ->select(array('id', 'password'))
  ->chunk(50,function($users)
    foreach ($users as $user) 
        $user->password = Hash::make($user->password);
        $user->save();
    
  );

【讨论】:

以上是关于Laravel4:块函数不适用于模型保存()的主要内容,如果未能解决你的问题,请参考以下文章

laravel4 响应::json(array());不适用于托管

laravel 4将IP地址保存到模型

ASP.NET MVC 模型验证不适用于控制器构造函数之一

未找到 laravel 类(适用于 localhost 但不适用于 DO 服务器)

Propel toJson 或 exportTo('JSON') 不适用于 Laravel

自动对焦不适用于角度 10 的 chrome