Skip to content

Ru:criteria:howitworks

AlexeyDsov edited this page Apr 19, 2011 · 9 revisions

Как работает Criteria

(это еще не законченная статья, пожалуйста, не надо в нее вставлять куски больших непонятных примеров, без пояснений, со всякими вспомогательными классами Debug не относящимися к onPHP и т.п. Однако подправка логических ошибок, опечаток, корректировка фраз и т.д. приветствуется ;) )

Введение

Для более правильного использования Criteria необходимо иметь ввиду как именно она работает. Для примера будет использовать мету из первой статьи.

Формирование OSQL

Возьмем простой запрос из предыдущего примера - получение списка актеров, живущих в США плюс уберем вокруг 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
Clone this wiki locally