mgsmus Koyu biraz toplarlayıp detaylandırmaya çalıştım. Yeni bir konu mu açmalıydım bilemedim. Umarım açıklayacı olur ,)
İstediğ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);
Birkaç filtre örneği ile model sayfamdaki ilgili blok ise şu şekilde:
Not: DB::select olan bölümü normalde yukarıda "tableB'den son price değeri geliyor " diye yazdığım bölümdeki bloğu kullanıyordum.
...
public static $allowedSortingOptions = array (
'name desc' => 'Name - desc',
'name asc' => 'Name - asc',
'sort_order asc' => 'Sort - asc',
'sort_order desc' => 'Sort - desc',
'created_at desc' => 'created_at desc',
'price desc' => 'Price - desc',
'price asc' => 'Price - asc',
);
public function scopeListFrontEnd($query, $options = []){
extract(array_merge([
'page' => 1,
'perPage' => 12,
'sort' => 'sort_order asc',
'startYear' => null,
'endYear' => null,
'type' => null,
'des' => null,
'postFrom' => null,
'postTo' => null,
], $options));
if($type !== null) {
foreach ($type as $typ){
$query->whereHas('type', function($q) use ($typ){
$q->where('id', '=', $typ);
});
}
}
if($des !== null) {
$query->when($des, function ($whenQuery) use ($des) {
return $whenQuery->whereHas("destinations", function ($relationQuery) use ($des) {
$relationQuery->whereIn("id", $des);
});
});
}
if($startYear || $endYear){
$query->whereBetween('year', [$startYear, $endYear]);
}
foreach ($sort as $_sort){
if(in_array($_sort, array_keys(self::$allowedSortingOptions))){
$parts = explode(' ', $_sort);
if(count($parts) < 2){
array_push($parts, 'desc');
}
list($sortField, $sortDirection) = $parts;
if($sortField == 'price'){
\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");
}else{
$query->orderBy($sortField, $sortDirection);
}
}
}
$lastPage = $query->paginate($perPage, $page)->lastPage();
if($lastPage < $page){
$page = 1;
}
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.