2016-07-14 22 views
5

Đây là hàm tìm kiếm trả về từng thành viên có năm đăng ký gần đây nhất của họ.Truy vấn tham gia lồng nhau Laravel với trình tạo truy vấn

Tôi nhận nó hoạt động với lệnh gọi hàm DB :: raw(). Nhưng không thể làm cho nó hoạt động với trình tạo truy vấn.

Mã làm việc:

$query = DB::table('membership as m'); 
$query->join(
    DB::raw(
     '(SELECT my.* 
     FROM membership_years my 
     INNER JOIN (
      SELECT member_id,MAX(membership_year) AS max_my 
      FROM membership_years 
      GROUP BY member_id 
     ) my2 
     ON my.member_id = my2.member_id 
     AND my.membership_year = my2.max_my 
     ) my' 
    ) 
,'m.id','=','my.member_id'); 

nỗ lực của tôi trên mã builder truy vấn:

$query = DB::table('membership as m'); 
$query->join('membership_years as my', 
    function($j1){ 
    $j1->join('membership_years as my2', 
     function($j2){ 
     $j2->where('my.membership_year','=','MAX(my2.membership_year)') 
     ->on('my.member_id','=','my2.member_id'); 
     } 
    )->on('m.id','=','my.member_id'); 
    } 
); 

Lỗi kết quả là:

Gọi phương pháp xác định Illuminate \ Database \ Query \ JoinClause :: join()

Tôi không chắc chắn nếu điều này là do $j2 không có quyền truy cập vào phương thức tham gia nữa?

liệu MySQL truy vấn:

SELECT my.membership_year,m.* 
FROM membership AS m 
INNER JOIN 
    (
     SELECT my1.* 
     FROM membership_years my1 
     INNER JOIN 
     (
      SELECT member_id,MAX(membership_year) AS max_my 
      FROM membership_years 
      GROUP BY member_id 
     ) my2 
     ON my1.member_id = my2.member_id 
     AND my1.membership_year = my2.max_my 
    ) my 
ON m.id = my.member_id 
ORDER BY m.id ASC 

Trả lời

2

Way 1. Bạn có thể viết một phần của truy vấn với người xây dựng:

$query = DB::table('membership as m') 
     ->select('my.membership_year', 'm.*') 
     ->join(DB::raw('(
      SELECT my1.* 
      FROM membership_years my1 
      INNER JOIN (
       SELECT member_id, MAX(membership_year) AS max_my 
       FROM membership_years 
       GROUP BY member_id 
      ) my2 
      ON my1.member_id = my2.member_id 
      AND my1.membership_year = my2.max_my 
     ) my'), 
     'm.id', '=', 'my.member_id') 
     ->orderBy('m.id'); 

Way 2. Ngoài ra bạn có thể viết các truy vấn con và sử dụng toSql() phương pháp:

$sub1 = DB::table('membership_years') 
    ->select('member_id', DB::raw('MAX(membership_year) AS max_my')) 
    ->groupBy('member_id'); 

$sub2 = DB::table('membership_years as my1') 
    ->select('my1.*') 
    ->join(DB::raw('(' . $sub1->toSql() . ') my2'), 
      function ($join) { 
       $join 
        ->on('my1.member_id', '=', 'my2.member_id') 
        ->on('my1.membership_year', '=', 'my2.max_my'); 
      }); 

$query = DB::table('membership as m') 
    ->select('my.membership_year', 'm.*') 
    ->join(DB::raw('(' . $sub2->toSql() . ') my'), 'm.id', '=', 'my.member_id') 
    ->orderBy('m.id'); 
Các vấn đề liên quan