2017-08-17 18 views
1

生のクエリにはLaravel DB::select()を使用しましたが、パラメータをIN句に渡している間に問題が発生しました。IN節のLaravel生クエリパラメータ

第一クエリ:

$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 

第二のクエリは、常に空の結果を返します。文字列でin()を使用して

+0

'$ team'の値は何ですか? –

+0

あなたのクエリは、ユーザによる条件付き集計を使用してより簡単に書き換えられると思います。 –

+0

それは文字列の配列です –

答えて

5

正しいクエリは次のとおりです。

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

ありがとう、その非常に役立ちます –