Level 50
Why not use Eloquent and make your life easier?
https://laravel.com/docs/master/eloquent#introduction
When you write a monster query like this, it is always going to create issues like your initial question.
Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.
Hello!
I have a problem when I'm trying to pass a query with subquerys to Eloquent. I'm using Laravel 5.3.31 and the IDE crashes in the line })->on('Trackings.user_id', '=', 'u.id');.
This is the query:
SELECT u.id, u.name FROM users u
INNER JOIN perfil p ON p.user_id = u.id
WHERE p.user_id = p.empresa_id AND
p.activo = 1 AND
p.user_id NOT IN (
SELECT uemp.id
FROM users u
INNER JOIN perfil p ON p.user_id = u.id
INNER JOIN users uemp ON uemp.id = p.empresa_id
INNER JOIN
(
SELECT ut.user_id, MAX(created_at) AS Fecha
FROM users_trackings ut
WHERE ut.created_at >= NOW() - INTERVAL 3 MONTH
GROUP BY user_id
) AS Trackings ON Trackings.user_id = u.id
GROUP BY uemp.id
) AND
p.user_id NOT IN (
SELECT uemp.id
FROM usu_ser_param usp
INNER JOIN usu_ser us on us.id = usp.usu_ser_id
INNER JOIN servicios s on s.id = us.servicio_id
INNER JOIN users u on u.id = us.user_id
INNER JOIN perfil p on p.user_id = u.id
INNER JOIN users uemp ON uemp.id = p.empresa_id
WHERE usp.parametro_id = 3 AND
p.activo = 1 AND
((s.appnombre = 'platform1' AND s.ruta = 'platform1.index') OR (s.appnombre = 'platform2' AND s.ruta = 'platform2.index') OR (s.appnombre = 'platform3' AND s.ruta = 'platform3.index')) AND
usp.valor NOT LIKE 'https://FR%' AND usp.valor NOT LIKE 'https://platform2.FR%'
GROUP BY uemp.id
);
And this is the eloquent translation:
$result = Users::join('perfil as p', 'p.user_id', '=', 'users.id')
->whereColumn('p.user_id', 'p.empresa_id')
->where('p.activo', 1)
->whereNotIn('p.user_id', function($sq1) {
$sq1->from('users as u');
$sq1->join('perfil as p', 'p.user_id', '=', 'users.id');
$sq1->join('users as uemp', 'uemp.id', '=', 'p.empresa_id');
$sq1->join('users_trackings', function($join) {
$join->selectSub(function($sq2) {
$sq2->select('users_trackings.user_id', 'MAX("users_trackings.created_at") as Fecha');
$sq2->where('users_trackings.created_at', '>=', 'NOW() - INTERVAL 3 MONTH');
}, 'Trackings');
})->on('Trackings.user_id', '=', 'u.id');
$sq1->select('uemp.id');
$sq1->groupBy('uemp.id');
$sq1->get();
})
->where('usu_ser_param.parametro_id', 3)
->whereNotIn('p.user_id', function($sq3) {
$sq3->from('usu_ser_param as usp');
$sq3->join('usu_ser as us', 'us.id', '=', 'usu_ser_param.usu_ser_id');
$sq3->join('servicios as s', 's.id', '=', 'us.servicio_id');
$sq3->join('users as u', 'u.id', '=', 'us.user_id');
$sq3->join('perfil as p', 'p.user_id', '=', 'u.id');
$sq3->join('users as uemp', 'uemp.id', '=', 'p.empresa_id');
$sq3->where('usu_ser_param.parametro_id', 3);
$sq3->where('p.activo', 1);
$sq3->where(function($sq4) {
$sq4->where(['s.appnombre' => 'platform1', 's.ruta' => 'platform1.index']);
$sq4->orWhere(['s.appnombre' => 'platform2', 's.ruta' => 'platform2.index']);
$sq4->orWhere(['s.appnombre' => 'platform3', 's.ruta' => 'platform3.index']);
});
$sq3->where('usu_ser_param.valor', 'not like', "https://FR%");
$sq3->where('usu_ser_param.valor', 'not like', "https://platform2.FR%");
$sq3->select('uemp.id');
$sq3->groupBy('uemp.id');
})
->get();
Any help? What's wrong?
EDIT: Problem solved
Please or to participate in this conversation.