Laravel представляет новые методы для оптимизации запросов отрицательных отношений, облегчая поиск записей, в которых отсутствуют конкретные отношения, сохраняя при этом чистый, читабельный код.
Новые методы whereDoesntHaveRelation предоставляют лаконичный способ запроса записей без конкретных отношений:
User::whereDoesntHaveRelation(
'posts',
'published_at',
'>',
now()->subWeek()
)->get();
User::whereMorphDoesntHaveRelation(
'activities',
[Comment::class, Review::class],
'is_featured',
true
)->get();
Эти методы особенно ценны в системах управления контентом:
class ContentManager
{
public function findDormantAuthors()
{
return User::whereDoesntHaveRelation(
'articles',
'published_at',
'>',
now()->subDays(60)
)->get();
}
public function getUnmoderatedContent()
{
return Article::whereDoesntHaveRelation(
'moderations',
'reviewed_at',
'!=',
null
)->get();
}
public function getUnpopularContent()
{
return Article::whereMorphDoesntHaveRelation(
'reactions',
[Like::class, Share::class, Bookmark::class],
'created_at',
'>',
now()->subMonth()
)->get();
}
public function archiveStaleContent()
{
return Article::query()
->whereDoesntHaveRelation('comments', 'id', '!=', null)
->whereDoesntHaveRelation('views', 'id', '!=', null)
->whereDoesntHaveRelation(
'updates',
'created_at',
'>',
now()->subMonths(6)
)
->update(['status' => 'archived']);
}
}
Эти новые методы устраняют необходимость в сложных замыканиях whereDoesn'tHave, делая запросы отрицательных отношений более интуитивно понятными и удобными в обслуживании, улучшая при этом читаемость кода.