2015-06-02 3 views
-1

У меня есть этот запрос:MySQL для Laravel запроса

select concat(firstname, ' ', lastname), email 
from users 
    where id in(
    select user_id 
     from company_user 
      where company_id in (
      select id 
       from companies 
       where id in (
        select company_id 
        from activities 
         where created_at between DATE_SUB(curdate(), INTERVAL 8 DAY) 
          and DATE_SUB(curdate(), INTERVAL 6 DAY) 
         ) 
        ) 
       ); 

И я хотел бы сделать его более «Laravel людей».

Я уже сделали модель (и отношения на нем) для каждой таблицы:

активности (который принадлежит компании) Company (который имеет отношение N-к-N с пользователем) пользователя (который имеет отношения N-to-N с Компанией)

Я думаю, что он охватывает все. Спросите меня о каких-либо недостающих деталях.

Спасибо.

+0

Пожалуйста, обратите внимание на 'whereHas' Например, это поможет вам начать, http://laravel.com/docs/5.0/eloquent#querying-relations – user2094178

ответ

1

Или с соединениями равный ответ spencer7593:

User::select(DB::raw('CONCAT(users.firstname, ' ', users.lastname)'), 'users.email') 
     ->join('company_user', 'company_user.user_id', '=', 'users.id') 
     ->join('companies', 'companies.id', '=', 'company_user.company_id') 
     ->join('activities', 'activities.company_id', '=', 'companies.id') 
     ->whereBetween('created_at', [ 
      DB::raw('CURDATE() - INTERVAL 8 DAY'), 
      DB::raw('CURDATE() - INTERVAL 6 DAY') 
     ]) 
     ->groupBy('users.id') 
     ->get(); 
+0

Спасибо, приятель. Оно работало завораживающе. –

1

Вы можете начать с запроса более дружественного к MySQL, используя простые операции соединения, а не все конструкции IN (subquery).

Например:

SELECT CONCAT(u.firstname, ' ', u.lastname) 
     , u.email 
     FROM users u 
     JOIN company_user cu 
     ON cu.user_id = u.id 
     JOIN companies c 
     ON c.id = cu.company_id 
     JOIN activities a 
     ON a.company_id = c.id 
    WHERE a.created_at BETWEEN CURDATE() - INTERVAL 8 DAY AND CURDATE() - INTERVAL 6 DAY 
    GROUP BY u.id 
0

Я не проверял этот код, но считаю, что это должно быть так;)

User::select(DB::raw('concat(firstname, ' ', lastname)'), 'email') 
    ->whereIn('users.id', function ($query) { 
      $query->select('company_user.user_id') 
        ->from('company_user') 
        ->whereIn('company_id', function ($query2) { 
         $query2->select('companies.id') 
           ->from('companies') 
           ->whereIn('companies.id', function ($query3) { 
            $query3->select('activities.company_id') 
              ->from('activities') 
              ->whereBetween('created_at', [ 
               DB::raw('DATE_SUB(curdate(), INTERVAL 8 DAY)'), 
               DB::raw('DATE_SUB(curdate(), INTERVAL 6 DAY)') 
              ]); 

           }); 
        }); 
     })->get(); 
Смежные вопросы