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;
Ці нові методи відносин спрощують написання виразного та підтримуваного коду, чітко демонструючи зв’язки між моделями та роблячи доступ до складних даних більш інтуїтивним