Соединение слева работает не так, как предполагалось, но SQL принимает его

#php #laravel #laravel-query-builder

#php #laravel #laravel-конструктор запросов

Вопрос:

HomeController.php

 public function index()
{      
    $employees = DB::table('timings')
                ->distinct()
                ->selectRaw("timings.employee_id, min(time_logged) AS minTime, max(time_logged) AS maxTime")
                ->leftJoin('employees','timings.employee_id','=','employees.employee_id')
                ->where( DB::raw('cast(time_logged AS date)') , DB::raw('CURDATE()'))
                ->groupBy('timings.employee_id', DB::raw('cast(time_logged AS date)') )
                ->get();

    return view('home',compact('employees'));
}
  

Фактический SQL

 employee_id  |   minTime     |    maxTime     
1                2019-03-25       09:00:00 2019-03-25 14:00:00
...
  

Результат

 Array ( 
    [0] => stdClass Object ( 
    [employee_id] => 1 
    [minTime] => 2019-03-25 09:00:00 
    [maxTime] => 2019-03-25 14:00:00 
)
... 
  

По какой-то причине MYSQL принимает соединение по левому краю, но ничего не происходит! У меня есть 2 таблицы, сотрудники и тайминги. Включаю ли я leftJoin или комментирую его, код работает, но таблица EMPLOYEE не отображается. Я понятия не имею, почему это не работает.

Комментарии:

1. Какой фактический SQL сгенерирован? Пожалуйста, опубликуйте это.

2. @Dai добавлено при редактировании

3. @NazarAbubaker вы все еще не включили сгенерированный SQL.

4. Это SQL, который он генерирует: select distinct timings.employee_id,min(time_logged) AS minTime,max(time_logged) AS maxTime from `timings` left join `employees` on `timings`.`employee_id` = `employees`.`employee_id` where cast(time_loggedASdate) = CURDATE() group by `timings`.`employee_id`, cast(time_loggedASdate)

5. Вы забыли добавить в запрос селекторы столбцов first name, lastname и avatar? в selectRaw().

Ответ №1:

Вы не выбрали детали из employee таблицы

 ->selectRaw("timings.employee_id, min(time_logged) AS minTime, max(time_logged) AS maxTime,employees.first_name, employees.last_name")