Спрощуйте запити з негативними відношеннями за допомогою методу whereDoesntHave у Laravel

Перекладено ШІ
Оригінал: Laravel News
Оновлено: 05 червня, 2025
Laravel запровадив нові методи для спрощення запитів з негативними відносинами, що дозволяє легше знаходити записи без специфічних відносин при збереженні чистоти та зрозумілості коду. Читайте далі, щоб дізнатися, як ці методи можуть оптимізувати вашу роботу в системах управління контентом!

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']);
    }
}

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