====== lmbSelectRawQuery ====== **lmbSelectRawQuery** - при помощи этого класса возможно создавать объектные SQL шаблоны с метками-расширениями. Потомок от [[lmb_criteria_query]]. Список возможных меток расширения: * **%fields%** - для вставки дополнительных полей. * **%tables%** - для вставки дополнительных таблиц. * **%left_join%** - для вставки объединений. * **%where%** - для вставки условий. * **%group%** - для вставки группировок. * **%having%** - для вставки условий, связанных с группировкой. * **%order%** - для вставки сортировок. :!: Если метка была не заполнена, она в любом случае удаляется из конечного запроса. ===== Пример lmbSelectRawQuery ===== class CocktailDetailInfoQuery extends lmbSelectRawQuery { function __construct() { $sql = 'SELECT '. 'cocktail.id as id, '. 'cocktail.name as name, '. 'cocktail.ru_name as ru_name, '. 'cocktail.description as description, '. 'cocktail.dish_id as dish_id, '. 'cocktail.method_id as method_id, '. 'cocktail.type_id as type_id, '. 'dish.name as dish_name, '. 'preparation_method.name as preparation_method_name, '. 'cocktail_type.name as cocktail_type_name '. '%fields% '. 'FROM '. 'cocktail '. ' LEFT JOIN dish ON dish.id = cocktail.dish_id '. ' LEFT JOIN preparation_method ON preparation_method.id = cocktail.method_id '. ' LEFT JOIN cocktail_type ON cocktail_type.id = cocktail.type_id '. '%tables% ' . '%where% %group% %having% %order%'; parent :: __construct($sql); } } ===== Методы для расширения lmbSelectRawQuery ===== Для каждой из меток (расширения) есть свой собственный метод для расширения. **addField($field, $alias = null)** или **field($field, $alias = null)** $query->addField('dish.long_name'); $query->field('dish.long_name', 'dish_full_name'); **addTable($table, $alias = null)** или **from($table, $alias = null)** $query->addTable('special_method as sm'); $query->table('special_method', 'sm'); **addOrder($field, $type='ASC')** или **order($field, $type='ASC')** $query->addOrder('dish.long_name'); $query->order('dish.long_name', 'DESC'); **addGroupBy($group)** или **group($group)** $query->addGroupBy('cocktail.dish_id'); $query->group('cocktail.dish_id'); **addCriteria($criteria)** или **where($criteria)**. Для расширения %where% применяется именно эти методы. $criteria - объект из под-системы [[Criteria]]. Если в качестве criteria задана обычная строка - она будет автоматически преобразована в объект класса [[lmbsql_criteria|lmbSQLCriteria]]. $query->addCriteria(new lmbSQLFieldCriteria('ingredient.id', $ingredient_ids, lmbSQLFieldCriteria :: IN)); $query->where(lmbSQLCriteria :: in('ingredient.id', $ingredient_ids)); **addHaving($criteria)** или **having($criteria)**. Для расширения %having%% также используются объекты из подсистемы [[Criteria]]. Если в качестве criteria задана обычная строка - она будет автоматически преобразована в объект класса [[lmbsql_criteria|lmbSQLCriteria]]. $query->addHaving(new lmbSQLCriteria('count > 0')); $query->having('count > 0'); **addLeftJoin($table, $field, $connect_table, $connect_field)** или **join($table, $field, $connect_table, $connect_field)** $query->addLeftJoin('dish', 'id', 'cocktail', 'dish_id'); $query->join('dish', 'id', 'cocktail', 'dish_id'); ===== Пример расширения lmbSelectRawQuery ===== Небольшой кусок кода из класса, который добавляет в query новые условия: [...] function _analizeIngredientCondition($query) { $ingredient_ids = $this->_getIngredientIdsArray(); $ingredient_names = $this->_getIngredientNames(); if(!(sizeof($ingredient_ids) || sizeof($ingredient_names))) return false; $criteria = null; if(sizeof($ingredient_ids)) $criteria = new lmbSQLCriteria :: in('ingredient.id', $ingredient_ids); foreach($ingredient_names as $name) { if(!$criteria) $criteria = new lmbSQLCriteria :: like('ingredient.name', '%'.$name.'%'); else { $new_criteria = new lmbSQLCriteria :: like('ingredient.name', '%'.$name.'%'); $criteria->addOr($new_criteria); } } $query->addField('COUNT(cocktail.id) as ccount'); $query->addTable('recipe_item'); $query->addTable('ingredient'); $query->addCriteria('recipe_item.cocktail_id = cocktail.id'); $query->addCriteria('recipe_item.ingredient_id = ingredient.id'); $query->addOrder('ccount', 'DESC'); $query->addCriteria($criteria); $query->addGroupBy('recipe_item.cocktail_id'); return true; } [...]