• 09-03-2021, 15:17:44
    #1
    Merhaba,

    istediğim sonucu aldığım bir sql sorgum var. Bu sorguyu laravel model sayfamda çalıştırmak istiyorum.

    Bu anlamda sorumu özet ve detaylı olarak 2 şekilde aşağıya bırakıyorum. Anlaşılmayan yer varsa lütfen cevap yazın.

    ÖZET:
    Aşağıdaki çalışan sql sorguma göre nasıl bir laravel sorgusu oluşturabilirim?
    select `tableA`.*, `tableB`.`start_date`, `tableB`.`end_date`, `tableB`.`price`  from `tableA` right join( SELECT id, start_date, end_date, pro_id, price, DATEDIFF(`tableB`.`end_date`, '2021-03-07') diff FROM `tableB` GROUP BY id order by diff asc ) `tableB` on `tableA`.`id` = `tableB`.`pro_id` where (date(`end_date`) >= '2021-03-07') group by `tableA`.`id` order by `price` desc
    YA DA

    şu kod ile tableB'den son price değeri geliyor. Bunu tam tersine çevirip, bugünden küçük olmama şartı eklemek de istediğim sonucu verir diye düşünüyorum. Bu yapılabilir mi?
    $query->join('tableB', 'tableA.id', '=', 'tableB.pro_id')
          ->select('tableA.*', 'tableB.start_date', 'tableB.end_date', 'tableB.price')
            ->where(function($sq) use ($postFrom) {
                $sq->when($postFrom[0]=='0', function ($syq) {
                    $syq->whereDate('end_date', '>=', now()->format('Y-m-d');
                }, function ($stq) use ($postFrom) {
                    $stq->whereDate('start_date', '<=', $postFrom[0])
                       ->whereDate('end_date', '>=', $postFrom[0]);
                });
            })->groupBy('tableA.id')->orderBy('price', desc);
    DETAYLI ANLATIM:
    Birçok farklı formatta bunu çalıştırmayı denedim fakat bir türlü doğru sonucu alamadım.
    En son DB::Select kullandım:
    \DB::select("select `tableA`.*, `tableB`.`start_date`, `tableB`.`end_date`, `tableB`.`price`  from `tableA` right join( SELECT id, start_date, end_date, pro_id, price, DATEDIFF(`tableB`.`end_date`, '2021-03-07') diff FROM `tableB` GROUP BY id order by diff asc ) `tableB` on `tableA`.`id` = `tableB`.`pro_id` where (date(`end_date`) >= '2021-03-07') group by `tableA`.`id` order by `price` desc");
    Fakat burada filtreleme yapıldığı için normal $query düzeni ile devam etmem gerekiyor sanırım.
    return edilen şu kısımdan dolayı bunu düşünüyorum.
    return $query->paginate($perPage, $page);
    Not: Laravel sürümüm desteklemediği için joinSub kullanamıyorum.
    Not2: Uzun zamandır bununla uğraşıyorum. Fikri olup uğraşmak istemezseniz de en azından bir ipucu bırakırsanız mutlu olurum.

    Okuyan herkese teşekkür ederim.
  • 10-03-2021, 12:29:19
    #2
    Sorun şu şekilde çözüldü:

    TableA::select('tableA.*', 'tableB.start_date', 'tableB.end_date', 'tableB.price')
             ->join(DB::raw("(SELECT id, start_date, end_date, pro_id, price,
             DATEDIFF(`tableB`.`end_date`, '2021-03-07') diff
             FROM `tableB` GROUP BY id order by diff asc) tableB "), function ($join)
            {
                  $join->on('tableA.id', '=', 'tableB.pro_id');
            })
            ->whereDate('tableB.end_date','>=','2021-03-07')
            ->groupBy('tableA.id')->orderBy('price','DESC')->get();