CakePHP 3 findery
W artykule przybliżę nieco tworzenie własnych finderów. Jest to warstwa abstrakcji dla często wykonywanych zapytań. Można wtedy użyć po prostu nazwy naszego customowego findera. Findery tworzymy jako metody w pliku Table (można też je tworzyć w behaviorach). Ich nazwa musi się zaczynać od słowa find. Spójrz na poniższy przykład. Nasze findery to metody findOwnedBy i findPublished.
class ArticlesTable extends Table { public function findOwnedBy(Query $query, array $options) { $user = $options['user']; return $query->where(['author_id' => $user->id]); } public function findPublished(Query $query, array $options) { return $query->where(['published' => true]); } } // In a controller or table method. // Prior to 3.6.0 $articles = TableRegistry::get('Articles'); $articles = TableRegistry::getTableLocator()->get('Articles'); $query = $articles->find('ownedBy', ['user' => $userEntity]);Przy używaniu finderów można wykorzystać wiele z nich (tzw. stack). Na przykład:
$articles = TableRegistry::getTableLocator()->get('Articles'); $query = $articles->find('published')->find('ownedBy');
Dynamiczne findery
ORM CakePHP dostarcza mechanizm tzw. dynamicznych finderów. Pozwalają one na tworzenie prostych i przydatnych zapytań bez pisania dodatkowego kodu. Zobaczmy jak to wygląda w praktyce. Przykładowo w kontrolerze.$query = $this->Users->findByUsername('user1'); $query = $this->Users->findAllByUsername('john_doe55');Jeśli w modelu jest pole username powyższe metody będą szukały po polu username. Ten sam przykład w metodzie Table.
$users = TableRegistry::getTableLocator()->get('Users'); $query = $users->findByUsername('user2'); $query = $users->findAllByUsername('usr1');Używając dynamicznych finderów możemy aplikować warunki do wielu pól.
$query = $users->findAllByUsernameAndApproved('user1', 1); $query = $users->findAllByUsernameOrEmail('user2', '[email protected]');