请考虑我的班级构造函数:
public function __construct(User $query = null)
{
$this->query = $query ?: (new User())->getQuery();
}
我有这样的方法:
public function getNullActivityUsers()
{
$query = clone $this->query;
$query->whereNull('activity');
return $query->get();
}
当我调用此方法时,sql查询将是:
select * from `users` where `activity` is null
但是当我将此方法推入 laravel队列时,查询将是:
select * from `users`
实际上,whereNull
的链接方法不会在该方法中调用。我应该将方法更改为此版本:
public function getNullActivityUsers()
{
$query = clone $this->query;
$query = $query->whereNull('activity');
return $query->get();
}
这样可以解决问题: $ query = $ query-> whereNull('activity');
但我想知道,为什么laravel在这种情况下的行为不同。因为如果我在队列外测试方法,链接将在那里。但如果我运行它抛出队列,它将获得其他结果。
((想象一下,我应该始终使用clone
。)
答案 0 :(得分:0)
我没有测试过它,如果它像这样工作,我会说这是一个错误。
然而,最重要的是 - 在验证发生了什么之前,你是否已停止/重新启动队列?在这种情况下,您可能会得到误报,因为队列将使用旧代码。每次在代码中进行更改时,都应该重新启动队列工作程序,以确保它会看到代码中所做的更改。如果是这种情况,请参阅Queue workers and deployment部分。