Warto poznawać narzędzia, jakimi dysponujemy, zwłaszcza nowe metody. Z drugiej strony powinniśmy pamiętać, że nie zawsze one działają jak chcemy i mają swoje ograniczenia. Poznajmy withExists.

Ok, rzućmy okiem na tę komendę:

Artisan::command('person-with-notes {id}', function (int $id) {

    $person = Person::withExists('notes')->findOrFail($id);
    $this->comment($person->notes_exists ? "{$person->full_name} has notes" : "{$person->full_name} has no notes");
    
});

Tutaj mamy do result setu dołączoną kolumnę notes_exists, która zawiera prawdę bądź fałsz. Sama relacja notes nie została „zachłannie” zaciągnięta, tylko kolumna informująca czy posiada notatki czy nie.

Taka komenda już mi nie zadziałała:

Artisan::command('person-with-hidden-notes {id}', function (int $id) {

    $person = Person::withExists([
        'notes' => function ($query) {
            $query->where('hidden', 1);
        }
    ])->findOrFail($id);
    $this->comment($person);
    $this->comment($person->notes_exists ? "{$person->full_name} has notes" : "{$person->full_name} has no notes");
    
});

Czyli próba sprawdzenia, czy użytkownik ma jakąś ukrytą notatkę. Nie pomagało używanie true (choć table->boolean to tinyint), ani nawet upewnienie się, że wszystkie notatki użytkownika są ukryte:

UPDATE `notes` 
SET hidden = 1 
where person_id = 85; 

Natomiast gdy próbuję wyszukać coś tekstowego to działa bez problemu:

Artisan::command('person-with-hidden-notes {id}', function (int $id) {

    $person = Person::withExists([
        'notes' => function ($query) {
            $query->where('title', "Adipisci numquam et iusto.");
        }
    ])->findOrFail($id);
    $this->comment($person);
    $this->comment($person->notes_exists ? "{$person->full_name} has notes" : "{$person->full_name} has no notes");
    
});

Wystarczy że użytkownik ma jedną notatkę z takim tytułem, aby dołączyć pole do result setu informujące, że tak jest.

Tak też (to znaczy z tekstowymi danymi) ta nowa metoda jest reklamowana:

$users = User::withExists([
    'posts as has_published_posts' => function ($query) {
        $query->where('status', 'published');
    }
])->get();

Czyli krótko mówiąc znać te nowinki trzeba, z drugiej strony wszystko musimy sami testować i patrzeć czy działa, wykonywać testy.