Дата последнего изменения: 27.10.2020
Все параметры getList, getRow и другие передаются вместе, при этом сразу же выполняется запрос и возвращается результат: все происходит за один вызов. Но существует и альтернативный способ конфигурации запроса и контроля за его выполнением - это объект Entity\Query:
// получение данных через getList $result = BookTable::getList(array( 'select' => array('ISBN', 'TITLE', 'PUBLISH_DATE') 'filter' => array('=ID' => 1) )); // аналогично через Entity\Query $q = new Entity\Query(BookTable::getEntity()); $q->setSelect(array('ISBN', 'TITLE', 'PUBLISH_DATE')); $q->setFilter(array('=ID' => 1)); $result = $q->exec();
Такой подход может быть удобным, когда необходима гибкость в построении запроса. Например, если параметры запроса заранее неизвестны и формируются программно, можно вместо множества разных аргументов использовать один объект Query, накапливая в нем параметры запроса:
$query = new Entity\Query(BookTable::getEntity()); attachSelect($query); attachOthers($query); $result = $query->exec(); function attachSelect(Entity\Query $query) { $query->addSelect('ID'); if (...) { $query->addSelect('ISBN'); } } function attachOthers(Entity\Query $query) { if (...) { $query->setFilter(...); } if (...) { $query->setOrder(...); } }
Также объект Entity\Query позволяет построить запрос, но не выполнять его. Это бывает полезным для выполнения подзапросов или же просто для получения текста запроса и последующего его использования:
$q = new Entity\Query(BookTable::getEntity()); $q->setSelect(array('ID')); $q->setFilter(array('=PUBLISH_DATE' => new Type\Date('2014-12-13', 'Y-m-d'))); $sql = $q->getQuery(); file_put_contents('/tmp/today_books.sql', $sql); // таким образом, запрос "SELECT ID FROM my_book WHERE PUBLISH_DATE='2014-12-31'" будет сохранен в файл, но не будет выполнен.
Полный список методов Entity\Query для реализации описанных выше возможностей:
select, group:
filter:
order:
limit/offset:
runtime fields:
Объект Query является основополагающим элементом при выборке данных, он же используется внутри стандартного getList. Именно поэтому эффективность переопределения методов getList сводится на нет: если при вызове соответствующего метода хак сработает, то при аналогичном запросе напрямую через Query уже нет.