That large of a query id use as is with the DB facade. Do you need an example.
Nov 9, 2020
10
Level 8
convert mysql query into eloquent
I have a MySQL query which is working fine, but I want to convert it into an Eloquent query, is this possible?
This query will get the sum the earnings of a user from different tables.
Query:
SELECT c.id,
c.username,
c.first_name,
c.last_name,
( a.amount + b.amount + d.amount + e.amount + f.amount ) AS total
FROM tbl_users c
LEFT JOIN (SELECT user_id,
Sum(amount) AS amount
FROM earnings_1
GROUP BY user_id) a
ON a.user_id = c.id
LEFT JOIN (SELECT user_id,
Sum(amount) AS amount
FROM earnings_2
GROUP BY user_id) d
ON d.user_id = c.id
LEFT JOIN (SELECT user_id,
Sum(amount) AS amount
FROM earnings_3
GROUP BY user_id) e
ON e.user_id = c.id
LEFT JOIN (SELECT user_id,
Sum(amount) AS amount
FROM earnings_4
GROUP BY user_id) f
ON f.user_id = c.id
LEFT JOIN (SELECT user_id,
Sum(amount) AS amount
FROM earnings_5
GROUP BY user_id) b
ON b.user_id = c.id
ORDER BY total DESC;
Level 56
Yes it is possible:
$rows = DB::table('tbl_users', 'c')
->select(['c.id', 'c.username', 'c.first_name', 'c.last_name'])
->selectRaw('(a.amount + b.amount + d.amount + e.amount + f.amount) AS total')
->leftJoinSub(function ($query) {
$query->from('earnings_1')
->select('user_id')
->selectRaw('Sum(amount) AS amount')
->groupBy('user_id');
}, 'a', 'a.user_id', '=', 'c.id')
->leftJoinSub(function ($query) {
$query->from('earnings_2')
->select('user_id')
->selectRaw('Sum(amount) AS amount')
->groupBy('user_id');
}, 'd', 'd.user_id', '=', 'c.id')
->leftJoinSub(function ($query) {
$query->from('earnings_3')
->select('user_id')
->selectRaw('Sum(amount) AS amount')
->groupBy('user_id');
}, 'e', 'e.user_id', '=', 'c.id')
->leftJoinSub(function ($query) {
$query->from('earnings_4')
->select('user_id')
->selectRaw('Sum(amount) AS amount')
->groupBy('user_id');
}, 'f', 'f.user_id', '=', 'c.id')
->leftJoinSub(function ($query) {
$query->from('earnings_5')
->select('user_id')
->selectRaw('Sum(amount) AS amount')
->groupBy('user_id');
}, 'b', 'b.user_id', '=', 'c.id')
->orderByDesc('total')
->get();
But honestly, I think the SQL version is more maintainable on the long run:
$sql = <<<SQL
SELECT c.id,
c.username,
c.first_name,
c.last_name,
( a.amount + b.amount + d.amount + e.amount + f.amount ) AS total
FROM tbl_users c
LEFT JOIN (SELECT user_id,
Sum(amount) AS amount
FROM earnings_1
GROUP BY user_id) a
ON a.user_id = c.id
LEFT JOIN (SELECT user_id,
Sum(amount) AS amount
FROM earnings_2
GROUP BY user_id) d
ON d.user_id = c.id
LEFT JOIN (SELECT user_id,
Sum(amount) AS amount
FROM earnings_3
GROUP BY user_id) e
ON e.user_id = c.id
LEFT JOIN (SELECT user_id,
Sum(amount) AS amount
FROM earnings_4
GROUP BY user_id) f
ON f.user_id = c.id
LEFT JOIN (SELECT user_id,
Sum(amount) AS amount
FROM earnings_5
GROUP BY user_id) b
ON b.user_id = c.id
ORDER BY total DESC;
SQL;
$rows = DB::select($sql);
1 like
Please or to participate in this conversation.