Laravel усуває давню неузгодженість у перевірці відносин, вдосконалюючи метод relationLoaded() для підтримки точкового запису для вкладених відносин, що відповідає синтаксису, який використовується для нетерплячого завантаження.
При роботі з моделями Eloquent управління відносинами формує основу ефективної взаємодії з базами даних. Laravel надав потужні інструменти для завантаження вкладених відносин за допомогою інтуїтивно зрозумілої точкової нотації:
$user->load('posts.comments');
Цей один рядок завантажує публікації користувача та всі пов'язані з ними коментарі, запобігаючи проблемам із запитами N+1, зберігаючи при цьому ефективність програми.
Однак до Laravel 12.10 перевірка цих навантажених відносин створювала невідповідність. Метод relationLoaded() працював лише для однорівневих відносин:
// Before Laravel 12.10
$user->load('posts.comments');
$user->relationLoaded('posts'); // true
$user->relationLoaded('posts.comments'); // false
Це обмеження змусило розробників писати додатковий код перевірки або використовувати обхідні шляхи:
// Workaround for checking nested relations
if ($user->relationLoaded('posts') && $user->posts->first()?->relationLoaded('comments')) {
// Posts and their comments are loaded
}
Завдяки внеску Mahesh Perera в Laravel 12.10, метод relationLoaded() тепер підтримує ту саму крапкову нотацію, яка використовується для завантаження відносин:
// After Laravel 12.10
$user->load('posts.comments');
$user->relationLoaded('posts'); // true
$user->relationLoaded('posts.comments'); // true
Це покращення усуває неузгодженість між завантаженням та перевіркою відносин, створюючи більш інтуїтивно зрозумілий та стійкий до помилок код.
Удосконалення спрощує поширені шаблони в додатках Laravel. Розглянемо систему каталогу товарів, яка відображає товари з категоріями та відгуками:
public function show(Product $product)
{
// Load only what we need
$relations = [];
if (!$product->relationLoaded('category')) {
$relations[] = 'category';
}
if (!$product->relationLoaded('reviews.customer')) {
$relations[] = 'reviews.customer';
}
if (!$product->relationLoaded('variants.images')) {
$relations[] = 'variants.images';
}
if (!empty($relations)) {
$product->load($relations);
}
return view('products.show', compact('product'));
}
Цей підхід запобігає непотрібним запитам до бази даних, завантажуючи лише відносини, яких ще немає, що значно покращує продуктивність програми.
Удосконалення також приносить користь стратегіям кешування та умовній обробці даних:
class OrderService
{
public function processOrder(Order $order)
{
// Conditionally load relationships based on current state
if (!$order->relationLoaded('items.product.category')) {
$order->load('items.product.category');
}
// Process order knowing all required data is loaded
return $this->calculateOrderTotal($order);
}
public function generateInvoice(Order $order)
{
$requiredRelations = [
'customer.billingAddress',
'items.product',
'payments.method'
];
$toLoad = collect($requiredRelations)
->reject(fn($relation) => $order->relationLoaded($relation))
->all();
if (!empty($toLoad)) {
$order->load($toLoad);
}
return $this->createInvoiceFromOrder($order);
}
}
покращений метод relationLoaded() створює узгодженість між завантаженням відносин та верифікацією, роблячи Eloquent ORM Laravel більш передбачуваним та зручним для розробників.