2017-01-20 5 views
1

mysqlのクエリをlaravelクエリビルダーに移行すると、エラーが発生します。詳細は以下の通りです。 MySQLのクエリが正しく動作しています。私を確認して訂正してください。どのようにしてmysqlクエリをlaravelクエリービルダーに適切に変換できますか?おかげmysqlクエリーがlaravelクエリービルダーに変換されるときにエラーが発生しましたか?

エラー

SQLSTATE[21000]: Cardinality violation: 1242 Subquery returns more than 1 row (SQL: select `c`.`firstname`, `c`.`lastname`, `p`.`order_id`, (SELECT VALUE FROM order_position_metas WHERE NAME = 'course_begin' AND order_position_id = order_position_metas.order_position_id) AS course_begin, (SELECT VALUE FROM order_position_metas WHERE NAME = 'course_end' AND order_position_id = order_position_metas.order_position_id) AS course_end, (SELECT ct.title FROM order_position_metas INNER JOIN course_types AS ct ON ct.id = VALUE WHERE NAME = 'course_type' AND order_position_id = order_position_metas.order_position_id) AS course_type from `order_position_metas` inner join `order_positions` as `p` on `p`.`id` = `order_position_metas`.`order_position_id` inner join `order_passengers` as `pp` on `pp`.`order_id` = `p`.`order_id` inner join `customers` as `c` on `c`.`id` = `pp`.`customer_id` where `name` = school_id and `value` = 62 order by `course_begin` asc, `course_end` asc, `course_type` asc) 

MySQLのクエリ

このクエリは

SELECT c.firstname, c.lastname, p.order_id, 
           (SELECT VALUE FROM order_position_metas WHERE NAME = 'course_begin' AND order_position_id = pm.order_position_id) AS course_begin, 
           (SELECT VALUE FROM order_position_metas WHERE NAME = 'course_end' AND order_position_id = pm.order_position_id) AS course_end, 
           (SELECT ct.title FROM order_position_metas INNER JOIN course_types ct ON ct.id = VALUE WHERE NAME = 'course_type' AND order_position_id = pm.order_position_id) AS course_type 
           FROM order_position_metas pm INNER JOIN order_positions p ON p.id = pm.order_position_id INNER JOIN order_passengers pp ON pp.order_id = p.order_id INNER JOIN customers c ON c.id = pp.customer_id 
           WHERE pm.name = 'school_id' AND pm.value = '".$request->schoolID."' ORDER BY course_begin ASC, course_end ASC, course_type ASC 

Laravel Querybuilder

を働いています
$nestedQueries = Orderpositionmeta::select('c.firstname', 'c.lastname', 'p.order_id', DB::raw("(SELECT VALUE FROM order_position_metas WHERE NAME = 'course_begin' AND order_position_id = order_position_metas.order_position_id) AS course_begin"), DB::raw("(SELECT VALUE FROM order_position_metas WHERE NAME = 'course_end' AND order_position_id = order_position_metas.order_position_id) AS course_end"), DB::raw("(SELECT ct.title FROM order_position_metas INNER JOIN course_types AS ct ON ct.id = VALUE WHERE NAME = 'course_type' AND order_position_id = order_position_metas.order_position_id) AS course_type")) 
        ->join('order_positions AS p', 'p.id', '=', 'order_position_metas.order_position_id') 
        ->join('order_passengers AS pp', 'pp.order_id', '=', 'p.order_id') 
        ->join('customers AS c', 'c.id', '=', 'pp.customer_id') 
        ->where('name', 'school_id') 
        ->where('value', $request->schoolID) 
        ->orderBy('course_begin') 
        ->orderBy('course_end') 
        ->orderBy('course_type') 
        ->get(); 
+0

でサブクエリを試し 'DD(DB :: getQueryLog())を構築しているクエリを確認し、それが働いている' –

答えて

1

このエラーでは、サブクエリが複数の行を返すことを示しています。 LIMIT 1

$nestedQueries = Orderpositionmeta::select('c.firstname', 'c.lastname', 'p.order_id', 
DB::raw("(SELECT VALUE FROM order_position_metas WHERE NAME = 'course_begin' AND order_position_id = order_position_metas.order_position_id LIMIT 1) AS course_begin"), 
DB::raw("(SELECT VALUE FROM order_position_metas WHERE NAME = 'course_end' AND order_position_id = order_position_metas.order_position_id LIMIT 1) AS course_end"), 
DB::raw("(SELECT ct.title FROM order_position_metas INNER JOIN course_types AS ct ON ct.id = VALUE WHERE NAME = 'course_type' AND order_position_id = order_position_metas.order_position_id LIMIT 1) AS course_type")) 
->join('order_positions AS p', 'p.id', '=', 'order_position_metas.order_position_id') 
->join('order_passengers AS pp', 'pp.order_id', '=', 'p.order_id') 
->join('customers AS c', 'c.id', '=', 'pp.customer_id') 
->where('name', 'school_id') 
->where('value', $request->schoolID) 
->orderBy('course_begin') 
->orderBy('course_end') 
->orderBy('course_type') 
->get(); 
+0

感謝。 –

関連する問題