Laravel 4 - 如何关闭时间戳以更新整个集合

时间:2014-07-22 17:44:24

标签: php laravel laravel-4 eloquent

我试图在雄辩的收藏品上进行大规模更新。

所以我有我的查询,看起来有点像这样:

\Responder::with('details')
      ->where('job_number', $project->job_number)
      ->where('batch_id', ((int) $batch_id) - 1)
      ->where('updated_at', '<=', $target_time)
      ->whereHas('transactions', function($q) {
            $q->where('status', 'success');
      }, '<', 1)
      ->whereHas('details', function($q) {
            $q->where('email', '<>', '');
      });

此查询对象存储为$ query(因为我正在重复使用它 - 与我不想切换我执行查询的方式相同的原因),然后我执行更新集合,例如

$query->update(array('batch_id' => $batch_id));

除非更新所有&updated;更新所有内容,否则效果会非常好。时间戳。现在我喜欢时间戳,它们在其他地方广泛使用,所以我不能把它们全部关闭但是我想我可以暂时禁用它们但是我已经尝试了以下内容:

$query->timestamps = false;
$query->update(array('email_drop_off_index' => $batch_id));

我可以确认这不起作用,有没有办法做到这一点?

任何帮助非常感谢

2 个答案:

答案 0 :(得分:5)

timestamps = false应该在您的模型上进行,但您正在做的是在查询构建器上设置值。这就是为什么它没有被接收的原因。

timestamps是一个实例变量,因此您无法静态设置它,我也不认为有一种内置方法可以从查询构建器中执行此操作。所以我建议首先尝试实例化模型,然后从中创建一个新查询,如下所示:

$responder = new \Responder;
$responder->timestamps = false;

$query = $responder->newQuery()
    ->with('details')
    ->where('job_number', $project->job_number)
    ...; // the rest of your wheres

$query->update(array('email_drop_off_index' => $batch_id));

答案 1 :(得分:1)

这是一个可能的解决方案:继承您的Responder模型并关闭子类中的时间戳。

class MassUpdateResponder extends Responder
{
    public $timestamps = false;
}

然后使用您的新课程进行更新。这看起来有点像黑客,但它应该有效。

顺便说一句,做以下更新对我有用:

$query->timestamps = false;

$query->value = "new value";

$query->save();

update()方法可能会做一些不同的事情,导致它忽略$timestamps的值。