Метод rightJoin
Метод rightJoin применяется к запросу Query Builder и выполняет правое внешнее соединение таблиц. В результате запроса возвращаются все строки из правой таблицы и соответствующие строки из левой таблицы. Если строки в левой таблице отсутствуют, соответствующие поля заполняются значением NULL. Первым параметром передаётся название таблицы для соединения, вторым - условие соединения в виде замыкания или строки.
Синтаксис
<?php
use Illuminate\Support\Facades\DB;
DB::table('table1')
->rightJoin('table2', $column1, $operator, $column2)
->get();
?>
Пример
Давайте выполним правое соединение таблиц users и profiles для получения всех профилей с данными пользователей:
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\DB;
class UserController extends Controller
{
public function index()
{
$res = DB::table('users')
->rightJoin('profiles', 'users.id', '=', 'profiles.user_id')
->select('users.name', 'profiles.bio', 'profiles.avatar')
->get();
foreach ($res as $row) {
echo $row->name . ' - ' . $row->bio;
}
}
}
?>
Результат выполнения кода:
"John - Developer"
"Mary - Designer"
" - Artist"
"Tom - Manager"
В результате запроса все профили были получены, даже те, которые не имеют связанного пользователя (поле name для такого профиля будет равно NULL).
Пример с несколькими условиями
Давайте выполним правое соединение с несколькими условиями через замыкание:
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\DB;
class OrderController extends Controller
{
public function index()
{
$res = DB::table('orders')
->rightJoin('customers', function ($join) {
$join->on('orders.customer_id', '=', 'customers.id')
->where('customers.status', '=', 'active');
})
->select('customers.name', 'orders.total')
->get();
foreach ($res as $row) {
echo $row->name . ' - ' . $row->total;
}
}
}
?>
Результат выполнения кода:
"Alice - 150.00"
"Bob - 200.50"
"Charlie - 300.00"
"David - 450.75"
"Eva - "
"Frank - "
В результате все активные клиенты были получены с суммой их заказов. Клиенты без заказов также отображаются с пустым полем total.
Пример с использованием DB::raw
Давайте используем rightJoin с выражением DB::raw для более сложного условия:
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\DB;
class ProductController extends Controller
{
public function index()
{
$res = DB::table('products')
->rightJoin('categories', 'products.category_id', '=', 'categories.id')
->select(
'categories.name as category',
DB::raw('COUNT(products.id) as product_count'),
DB::raw('AVG(products.price) as avg_price')
)
->groupBy('categories.id', 'categories.name')
->get();
foreach ($res as $row) {
echo $row->category . ' - ' . $row->product_count . ' - ' . $row->avg_price;
}
}
}
?>
Результат выполнения кода:
"Electronics - 5 - 450.00"
"Books - 3 - 25.50"
"Clothing - 0 - "
"Food - 2 - 15.75"
"Furniture - 0 - "
В результате отображаются все категории, даже те, которые не имеют товаров (количество продуктов равно 0).