laravel查询构建器和队列中的克隆和链问题

时间:2017-12-13 08:52:36

标签: laravel laravel-5 eloquent laravel-query-builder laravel-queue

请考虑我的班级构造函数:

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。)

1 个答案:

答案 0 :(得分:0)

我没有测试过它,如果它像这样工作,我会说这是一个错误。

然而,最重要的是 - 在验证发生了什么之前,你是否已停止/重新启动队列?在这种情况下,您可能会得到误报,因为队列将使用旧代码。每次在代码中进行更改时,都应该重新启动队列工作程序,以确保它会看到代码中所做的更改。如果是这种情况,请参阅Queue workers and deployment部分。