Mysql / Laravel: Использование левого соединения для получения последних созданных на дату любого сотрудника - PullRequest
0 голосов
/ 13 июня 2019

Database Structure

Я пытаюсь получить все разделы и их последние created_at, используя левое соединение

Я использую запрос ниже

select es.*, sul.created_at as created_at from section as es 
left join section_update_logs as sul on es.id = sul.section_id 
where sul.emp_id = 3 
group by es.id 
order by es.id, sul.created_at asc;

очевидный вывод запроса - только показать, что записи, где emp_id равен 3, но я хочу, чтобы все записи таблицы section, если в section_update_logs нет записи сотрудника, должен быть нулевой / empty создал_at.

Желаемый вывод:

  1. все строки таблицы section
  2. created_at дата, если sul.section_id = section.id и emp_id = конкретного сотрудника.

Запрос Laravel:

$result = DB::table("section as es")
                ->select('es.*', 'sul.created_at')
                ->leftJoin('section_update_logs as sul', 'es.id', '=', 'sul.section_id')
                ->orderBy('es.weight')
                ->orderBy('sul.created_at')
                ->orWhere('sul.emp_id', $emp_id)
                ->groupBy('es.id')
                ->get();

Пожалуйста, помогите

Ответы [ 2 ]

1 голос
/ 13 июня 2019

Вы можете добавить замыкание к функции leftJoin, чтобы добавить больше условий.

$result = DB::table("section as es")
    ->select('es.*', DB::raw('MAX(sul.created_at)'))
    ->leftJoin('section_update_logs as sul', function ($join) use ($emp_id) {
        $join->on('es.id', '=', 'sul.section_id')
            ->where('sul.emp_id', $emp_id);
    })
    ->orderBy('es.weight')
    ->orderBy('sul.created_at')
    ->groupBy('es.id')
    ->get();

Таким образом, фильтр на sul.emp_id проверяется только тогда, когда отношениенайдено.

Чтобы получить тот же результат с вашим SQL-запросом, добавьте второе условие в ваше объединение, используя AND:

select es.*, MAX(sul.created_at) as created_at from section as es 
left join section_update_logs as sul on es.id = sul.section_id AND sul.emp_id = 3 -- HERE
group by es.id 
order by es.id, sul.created_at asc;
0 голосов
/ 13 июня 2019

вы должны использовать в первую очередь, так как вы должны отобразить результат конкретного сотрудника

$search = $request->input('id'); 
$data['result'] = DB::table("section")
   ->where('emp_id', $search)
   ->leftJoin('section_update_logs', 'section.id', '=', 'section_update_logs.section_id')
   ->orderBy('section_update_logs.created_at','desc')
   ->first();
   return view('viewblade', $data)

на ваш взгляд

{{ $result ->name }}
 ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...