/** НАДО ЗАМЕНИТЬ НА Cortex * Создает виртуальные поля в классе Query для связей один-ко-многим (выбирает значение из справочника для данного объекта) * Используется для нестандартных запросов. * Более эффективно, так как нет фложенных селектов * @param DBAL\Query $query */ private function addVirtualFieldsToQuery($query) { // Для всех связей один-ко-многим foreach ($this->tableMeta->getParents() as $v) { // Добавляем таблицу в секцию from $query->from(array($v['table'])); $virtual_field_name = 'cat_' . $v['table']; // Добавляем и маппим в красивые имена title и slug из справочника (надо, чтобы формировать ссылки) $query->select(array($v['table'] . '.title as ' . $virtual_field_name, $v['table'] . '.slug as ' . $virtual_field_name . '_slug')); // Добавляем связь в условия запроса $query->conditions(array($this->table . '.fko_' . $v['table'] . '=' . $v['table'] . '.id')); } }
/** * Комплексная функция для сложного запроса с сортировкой и фильтрацией * @param int $start номер первой записи (для постраничного чтения) * @param int $limit количество записей (для постраничного чтения) * @param bool $all если false, то только опубликованные * @param array $sort поле и направление сортировки array('field' => 'поле', 'dir' => 'направление') * @param array $filter массив фильтров, получается из url array(['field' => <название поля>, 'value' => <значение>], ...), можно посмотреть в контроллере node стр. 375 getFilter($f3, $path, $model) * @param string $additional_confitions строка дополнительных условий, полученная, например, из классов сложных фильров или просто кусок запроса WHERE, который будет добавлен к основному условию через AND * @param bool $with_related_fields включать или не включать связанные по один-ко-многим поля (название и slug) * @return array результат запроса */ public function getList($start = 0, $limit = 10, $all = true, $sort = null, $filter = null, $additional_conditions = null, $with_related_fields = true) { $params = array(); $params[] = ''; $query = new DBALQuery(); $group_table = \models\UserGroup::getInstance()->getTable(); $query->select($this->table . '.*, ' . $group_table . '.name as group_name')->from($this->table)->from($group_table)->conditions([$this->table . '.group_id = ' . $group_table . '.id'])->options(array('order' => [$this->table . '.id DESC'])); if ($additional_conditions) { $query->conditions([$additional_conditions]); } $list = $query->paginate($start, $limit); $nodes = array('pos' => $list['pos'], 'count' => $list['count'], 'subset' => array()); foreach ($list['subset'] as $k => $item) { $nodes['subset'][$k] = array_map('stripslashes', $item); $nodes['subset'][$k]['title'] = $this->toString($nodes['subset'][$k]); } $nodes['pages'] = $this->getPaginationPages($nodes['count'], $nodes['pos']); // \helpers\Debug::prePrintR($nodes); return $nodes; }
/** * Комплексная функция для сложного запроса с сортировкой и фильтрацией * @param int $start номер первой записи (для постраничного чтения) * @param int $limit количество записей (для постраничного чтения) * @param bool $all если false, то только опубликованные * @param array $sort поле и направление сортировки array('field' => 'поле', 'dir' => 'направление') * @param array $filter массив фильтров, получается из url array(['field' => <название поля>, 'value' => <значение>], ...), можно посмотреть в контроллере node стр. 375 getFilter($f3, $path, $model) * @param string $additional_confitions строка дополнительных условий, полученная, например, из классов сложных фильров или просто кусок запроса WHERE, который будет добавлен к основному условию через AND * @param bool $with_related_fields включать или не включать связанные по один-ко-многим поля (название и slug) * @return array результат запроса */ public function get($start = 0, $limit = 10, $all = true, $sort = null, $filter = null, $additional_conditions = null, $with_related_fields = true) { $params = array(); $params[] = ''; $query = new DBALQuery(); $query->select($this->table . '.*')->from($this->table)->options(array('order' => $this->getSortQueryPart($sort))); if ($additional_conditions) { $query->conditions([$additional_conditions]); } // echo $this->table.' '.$limit; // \helpers\Debug::prePrintR($filter); $clear_filter = $this->getFilterQueryPart($filter); // \helpers\Debug::prePrintR($clear_filter); // Проверка на наличие pid в фильтре, в этом случае надо посчитать кол-во потомков foreach ($clear_filter as $k => $c_filter) { if ($c_filter['field'] == 'pid') { $clear_filter[$k]['field'] = $this->table . '.pid'; // Чтобы не было ambigious $query->join($this->table); $query->options(['group' => [$this->table . '.id']]); break; } } if (!$all) { $clear_filter[] = array('field' => $this->table . '.published', 'value' => 1); } // \helpers\Debug::prePrintR($query); $query->filters($clear_filter); // \helpers\Debug::prePrintR($query); if ($with_related_fields) { $this->addVirtualFieldsToQuery($query); // \helpers\Debug::prePrintR($query); } if ($this->tableMeta->isSortable()) { $list['subset'] = $query->exec(); } else { $list = $query->paginate($start, $limit); } // \helpers\Debug::prePrintR($list['subset']); if ($this->tableMeta->hasItems()) { $item_model = \models\ContentItem::getInstance($this->table); } $nodes = array('pos' => $list['pos'], 'count' => $list['count'], 'subset' => array()); // $related_cats = RelationsManager::getPlural($this->slug); foreach ($list['subset'] as $k => $item) { $nodes['subset'][$k] = array_map('stripslashes', $item); if ($this->tableMeta->hasItems()) { $nodes['subset'][$k]['content_count'] = $item_model->count($item['id']); $nodes['subset'][$k]['tn'] = $item_model->getThumbnailId($item['id']); } else { $nodes['subset'][$k]['content_count'] = 0; $nodes['subset'][$k]['tn'] = null; } // if (count($related_cats) > 0) { // foreach ($related_cats as $rel_cat) { //// \helpers\Debug::prePrintR($rel_cat); // $nodes['subset'][$k]['releated'][$rel_cat['label']] = RelationsManager::getPluralSelectedFull($item['id'], $this->slug, $rel_cat['full_table_name']); // //$nc[$v['table']] = new NodeCategory($v['table']); // } // } } if (!$this->tableMeta->isSortable()) { $nodes['pages'] = $this->getPaginationPages($nodes['count'], $nodes['pos']); } // \helpers\Debug::prePrintR($nodes); return $nodes; }