Метод leftJoin
Метод leftJoin применяется к запросу Query Builder
и выполняет левое внешнее соединение с указанной таблицей.
В отличие от метода join, который возвращает только
совпадающие записи, leftJoin возвращает все записи
из левой таблицы, даже если в правой таблице нет
соответствующих записей. Первым параметром передаётся
имя таблицы для соединения, вторым - условие соединения
в виде строки или массива.
Синтаксис
<?php
DB::table($table)->leftJoin($table2, $column1, $operator, $column2);
?>
Пример
Давайте выполним левое соединение таблиц 'users' и 'posts'
по полю 'user_id':
<?php
use Illuminate\Support\Facades\DB;
$res = DB::table('users')
->leftJoin('posts', 'users.id', '=', 'posts.user_id')
->select('users.name', 'posts.title')
->get();
foreach ($res as $row) {
echo $row->name . ' - ' . ($row->title ?? 'no posts');
}
?>
Результат выполнения кода:
"John - article 1"
"John - article 2"
"Mary - no posts"
"Bob - article 3"
Как видно из результата, пользователь Mary включена в выборку, хотя у неё нет постов.
Пример
Давайте выполним левое соединение с несколькими условиями, используя массив:
<?php
use Illuminate\Support\Facades\DB;
$res = DB::table('products')
->leftJoin('orders', function ($join) {
$join->on('products.id', '=', 'orders.product_id')
->where('orders.status', '=', 'active');
})
->select('products.name', 'orders.quantity')
->get();
foreach ($res as $row) {
echo $row->name . ' - ' . ($row->quantity ?? '0');
}
?>
Результат выполнения кода:
"laptop - 3"
"mouse - 0"
"keyboard - 7"
"monitor - 0"
В этом примере мы используем замыкание для построения сложного условия соединения с дополнительной фильтрацией.
Пример
Давайте выполним левое соединение с использованием синтаксиса сокращённого условия:
<?php
use Illuminate\Support\Facades\DB;
$res = DB::table('authors')
->leftJoin('books', 'authors.id', 'books.author_id')
->select('authors.name', 'books.title')
->get();
foreach ($res as $row) {
echo $row->name . ' - ' . ($row->title ?? 'no books');
}
?>
Результат выполнения кода:
"Tolkien - The Lord of the Rings"
"Tolkien - The Hobbit"
"Rowling - Harry Potter"
"King - no books"
Сокращённый синтаксис предполагает, что оператор
сравнения - это равенство '='.
Пример
Давайте выполним левое соединение с использованием сырых выражений для более сложных условий:
<?php
use Illuminate\Support\Facades\DB;
$res = DB::table('employees')
->leftJoin('departments', DB::raw('employees.dept_id'), '=', DB::raw('departments.id'))
->select('employees.name', 'departments.name as dept_name')
->get();
foreach ($res as $row) {
echo $row->name . ' works in ' . ($row->dept_name ?? 'no department');
}
?>
Результат выполнения кода:
"Anna works in IT"
"Peter works in HR"
"Maria works in no department"
"John works in IT"
Использование DB::raw позволяет применять функции
базы данных или сложные выражения в условиях соединения.