Laravel查询生成器不替换问号

时间:2015-03-25 09:40:36

标签: laravel

我正在运行以下查询:

return $this->hasMany('App\Task', 'company')
    ->whereNotIn('id', function($query)
    {
        $query->from('tasks')->join('projects', function($join)
            {
                $join->on('projects.id', '=', 'tasks.project')
                    ->where('projects.status', '=', Project::STATUS_ARCHIVED);
            })
            ->select('tasks.id');
    });

但如果我输出整个原始查询,我会得到以下结果:

select * from `tasks` where `tasks`.`company` = 1 and `id` not in (select `tasks`.`id` from `tasks` inner join `projects` on `projects`.`id` = `tasks`.`project` and `projects`.`status` = ?)

正如您在原始查询结尾处看到的那样,问号未被实际值替换,而是'tasks'.'company' = 1

3 个答案:

答案 0 :(得分:1)

您可以收听illuminate.query事件。在查询之前添加以下事件侦听器:

use Event;

Event::listen('illuminate.query', function($query, $params, $time)
{
    dd([
        $query,  // prepared statement
        $params, // query params (? symbols will be replaced with)
        $time    // execution time
    ]);
});

答案 1 :(得分:0)

我通过使用

手动设置绑定找到了解决此问题的方法
->setBindings([Project::STATUS_ARCHIVED]);

以下是整个片段:

return $this->hasMany('App\Task', 'company')
    ->whereNotIn('id', function($query)
    {
        $query->from('tasks')->join('projects', function($join)
            {
                $join->on('projects.id', '=', 'tasks.project')
                    ->where('projects.status', '=', '?');
            })
            ->select('tasks.id')
            ->setBindings([Project::STATUS_ARCHIVED]);
    })
    ->where('status', '=', Task::STATUS_INCOMPLETE);

答案 2 :(得分:0)

您没有在查询结尾添加->get();

尝试:

return $this->hasMany('App\Task', 'company')
    ->whereNotIn('id', function($query)
    {
        $query->from('tasks')->join('projects', function($join)
            {
                $join->on('projects.id', '=', 'tasks.project')
                    ->where('projects.status', '=', Project::STATUS_ARCHIVED);
            })
            ->select('tasks.id');
    })->get();