2015-03-25 22 views
1

我運行下面的查詢: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

回答

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); 
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 
    ]); 
}); 
+0

是的,我知道你的意思,但實際的查詢是由引起的SQL語法錯誤抱怨說問號哎呦異常顯示。我只複製了由錯誤返回的SQL原始查詢,並用實際值替換了問號,然後使用Sequel Pro手動運行查詢。 – siannone 2015-03-25 10:08:43

+0

當你用實際值替換''?''並且手動運行查詢時,它是否正常工作? – 2015-03-25 10:16:03

+0

是的,它的工作。 – siannone 2015-03-25 10:17:53

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(); 
相關問題