2017-08-17 68 views
1

我使用Laravel DB::select()進行原始查詢,在將參數傳遞給IN子句時遇到問題。IN子句的Laravel原始查詢參數

1查詢:

$team = DB::table('TeamUserLinks') 
      ->orderBy('User_Name', 'asc') 
      ->lists('User_Name'); 

第二查詢:

$user_tasks = DB::select("SELECT usr_first_name,usr_last_name,username, 
    (SELECT COUNT(*) FROM task_assignee_user t WHERE t.user_id = u.id AND t.task_status = 1) as status_open, 
    (SELECT COUNT(*) FROM task_assignee_user t WHERE t.user_id = u.id AND t.task_status = 1 AND t.task_due_date < CURRENT_DATE) as overdue, 
    FROM user u where usr_initials in(" . $team . ")"); 

也試過:

"FROM user u where usr_initials in(?)",array($team)); 

$team = implode($team) //Not working while passing after implode 

usr_initials in('" . $team . "')");//Not working with quotes 

第二查詢總是返回空結果。

+0

'$ team'的價值是什麼? –

+0

我認爲你的查詢可以更簡單地使用用戶的條件聚合來重寫。 –

+0

這是一個字符串數組 –

回答

5

使用in()用繩子正確的查詢是:

WHERE field IN ('String1', 'String2', 'String3') 

所以,你需要同時添加報價逗號

在一個簡單的方法是:

"... FROM user u where usr_initials in('" . implode("', ' ", $team . "')"); 

但是,當你遇到'爲名稱的一部分 - 你的查詢將被打破,所以最好使用準備好的語句。像這樣的東西應該可以工作:

// here we create array of `?` of a size of team. 
$marks = array_fill(0, sizeof($team), '?'); 
// imploding it later will give us a string `?, ?, ?` 
// later every `?` will be replaced with a value of `$team` 

$user_tasks = DB::select(
    "SELECT usr_first_name,usr_last_name,username, 
     (SELECT COUNT(*) FROM task_assignee_user t WHERE t.user_id = u.id AND t.task_status = 1) as status_open, 
     (SELECT COUNT(*) FROM task_assignee_user t WHERE t.user_id = u.id AND t.task_status = 1 AND t.task_due_date < CURRENT_DATE) as overdue, 
     FROM user u where usr_initials in(" . implode(',', $marks) . ")", 
    $team 
); 
+0

謝謝,它非常幫忙 –