Спрощення зв'язків HasManyThrough за допомогою підтримки CanBeOneOfMany у Laravel

Перекладено ШІ
Оригінал: Laravel News
Оновлено: 09 травня, 2025
Laravel нещодавно додав нову функцію CanBeOneOfMany для Eloquent ORM, яка значно спрощує отримання окремих моделей з HasManyThrough відносин. Ця стаття розкриває, як використовувати ці нові можливості для покращення структури та читабельності вашого коду — дізнайтеся, як легко отримати останні, найстаріші або спеціально відфільтровані записи

Laravel покращує свій Eloquent ORM, додаючи підтримку CanBeOneOfMany для відносин HasManyThrough. Ця функція дозволяє розробникам елегантно отримувати окрему модель з відносини HasManyThrough, використовуючи чіткий та виразний синтаксис для отримання останніх, перших або налаштованих записів.

Eloquent вже забезпечував потужні інструменти для роботи з комплексними відносинами. Завдяки підтримці CanBeOneOfMany, ви тепер можете отримувати окрему модель з відносини HasManyThrough, спираючись на різні критерії:

namespace App\Models;
 
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasOneThrough;
 
class Customer extends Model
{
    /**
     * Отримати найновіше замовлення для клієнта.
     */
    public function latestOrder(): HasOneThrough
    {
        return $this->orders()->one()->latestOfMany();
    }
}

Ця функція особливо корисна для доступу до конкретних записів з великих наборів відносин:

namespace App\Models;
 
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasOneThrough;
use Illuminate\Database\Eloquent\Relations\HasManyThrough;
 
class Department extends Model
{
    /**
     * Отримати всі завдання для відділу.
     */
    public function tasks(): HasManyThrough
    {
        return $this->hasManyThrough(
            Task::class,
            Employee::class,
            'department_id',
            'employee_id'
        );
    }
 
    /**
     * Отримати найновіше завдання для відділу.
     */
    public function latestTask(): HasOneThrough
    {
        return $this->tasks()->one()->latestOfMany();
    }
 
    /**
     * Отримати найперше створене завдання для відділу.
     */
    public function firstTask(): HasOneThrough
    {
        return $this->tasks()->one()->oldestOfMany();
    }
 
    /**
     * Отримати найвищий пріоритет завдання для відділу.
     */
    public function criticalTask(): HasOneThrough
    {
        return $this->tasks()->one()->ofMany('priority', 'max');
    }
 
    /**
     * Отримати найтриваліше завдання.
     */
    public function longestTask(): HasOneThrough
    {
        return $this->tasks()->one()->ofMany([
            'estimated_hours' => 'max',
        ]);
    }
}

З визначеними методами відносин доступ до конкретних записів став простим:

$department = Department::find(1);
 
// Отримати найновіше завдання
$latestTask = $department->latestTask;
 
// Отримати найперше створене завдання
$firstTask = $department->firstTask;
 
// Отримати завдання з найвищим пріоритетом
$criticalTask = $department->criticalTask;
 
// Отримати завдання з найтривалішою оцінкою годин
$longestTask = $department->longestTask;

Ці нові методи відносин спрощують написання виразного та підтримуваного коду, чітко демонструючи зв’язки між моделями та роблячи доступ до складних даних більш інтуїтивним