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.