betulyilmaz Merhaba, forumumuza hoşgeldiniz. İlk istediğiniz şu şekilde olabilir:
SELECT users.id,
users.name,
SUM(i.amount) AS ins_total,
SUM(t.amount) AS tra_total
FROM users
JOIN installements i
ON users.id = i.customer_id
AND i.status = 'ODENDI'
JOIN transactions t
ON users.id = t.customer_id
AND t.payment_type = 'BORC'
GROUP BY users.id,
users.name
HAVING ins_total > tra_total
User::select([
'users.id AS id',
'users.name AS name',
DB::raw("SUM(installements.amount) AS ins_total"),
DB::raw("SUM(transactions.amount) AS tra_total"),
])
->join('installements', function ($join) {
$join
->on('users.id', '=', 'installements.customer_id')
->where('installements.status', 'ODENDI')
})
->join('transactions', function ($join) {
$join
->on('users.id', '=', 'transactions.customer_id')
->where('transactions.payment_type', 'BORC')
})
->groupBy([
'id',
'name'
])
->having('ins_total','>', 'tra_total')
->orderBy('id')
->paginate()
->withQueryString();
Elbette deneme şansım olmadığı için hata verebilir. Yol göstereceğini düşünüyorum, kendi ihtiyacınıza göre düzenlersiniz.
Diğer bir nokta ise Request parametrelerine nasıl ulaştığınız. Eğer bir değer SQL içerisine girecekse ve alabileceği değerler sınırlı ise bunları ya form request içinde ya da inline request içinde kontrol etmeniz gerekiyor:
// orderBy sadece asc ya da desc olabilir. Varsayılan asc.
$orderBy = $request->whenFilled('orderBy', function ($input) {
return !in_array($input, ['asc', 'desc'])
? 'asc'
: $input;
}, fn() => 'asc');
// sortBy sadece id ya da name olabilir, bunları arttırabilirsiniz. Varsayılan id.
$sortBy = $request->whenFilled('sortBy', function ($input) {
return !in_array($input, ['id', 'name'])
? 'id'
: $input;
}, fn() => 'id');
// perPage sadece 1 ile 100 arasında bir sayı olabilir. Bunu kontrol etmezseniz biri 999999 yazarak
// sisteminizi patlatır. Varsayılan 20.
$perPage = $request->whenFilled('perPage', function ($input) {
return !is_numeric($input) || $input < 1 || $input > 100
? 20
: $input;
}, fn() => 20);
Ayrıca $request->query() yerine $request->input() kullanın. Zaten bir istekte ya GET parametresini alabilirsiniz ya da POST, ikisi aynı anda olmaz. Request::input() sizin için otomatik olarak hangisi varsa alır.