Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.

FerranMunoz's avatar

Help with query and subquery

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

0 likes
1 reply

Please or to participate in this conversation.