-
Notifications
You must be signed in to change notification settings - Fork 52
Ru:criteria:howitworks
(это еще не законченная статья, пожалуйста, не надо в нее вставлять куски больших непонятных примеров, без пояснений, со всякими вспомогательными классами Debug не относящимися к onPHP и т.п. Однако подправка логических ошибок, опечаток, корректировка фраз и т.д. приветствуется ;) )
Для более правильного использования Criteria необходимо иметь ввиду как именно она работает. Для примера будет использовать мету из первой статьи.
Возьмем простой запрос из предыдущего примера - получение списка актеров, живущих в США плюс уберем вокруг USA обертку из DBValue
<?php
Criteria::create(Actor::dao())->
add(Expression::eq('country', 'USA'))->
add(OrderBy::create('name'))
getList();
?>
Как именно Criteria в этом случае догадывается что country - это property объекта, а 'USA' это значение?
У классов Expression, OrderBy, SQLFunction, Projection и др. подобных есть интерфейс MappableObject:
interface MappableObject extends DialectString
{
/**
* @return MappableObject
**/
public function toMapped(ProtoDAO $dao, JoinCapableQuery $query);
}
В этом методе классы создают новый инстанс себя (new $this
) и передают в новый объект свои параметры прогнанные через метод ProtoDAO::guessAtom. В этом методе в зависимости от типа переданного объекта с ним происходят следующие изменения:
- Если передан объект DBField или DBValue - возвращаются без изменения
- Если передан объект instanceof MappableObject, то у него вызывается метод toMapped и возвращается результат выполнения
- Если передана строка, то DAO пытается найти соотвествующей ей path из property. И в случае country и name она его находит, а в случае USA нет. B Таким образом country и name оборачиваются в DBField