generate($query, false); } /** * @param ActiveQuery|Db|mixed $query * @return string * @throws Exception */ public function count($query) { return $this->generate($query, true); } /** * @param ActiveQuery|Db|Sql $query * @param bool $isCount * @return string * @throws Exception */ private function generate($query, $isCount = false) { if (empty($query->from)) { $query->from = $query->getTable(); } $builder = array_filter([ $this->builderSelect($query->select, $isCount), $this->builderFrom($query->from), $this->builderAlias($query->alias), $this->builderJoin($query->join), $this->builderWhere($query->where), $this->builderGroup($query->group) ], function ($value) { return !empty($value); }); if ($isCount) { return implode('', $builder); } $order = $this->builderOrder($query->order); if (!empty($order)) { $builder[] = $order; } $builder[] = $this->builderLimit($query); return implode('', $builder); } /** * @param null $select * @param bool $isCount * @return string */ private function builderSelect($select = NULL, $isCount = false) { if ($isCount === true) { return 'SELECT COUNT(*)'; } if (empty($select)) { return "SELECT *"; } if (is_array($select)) { return "SELECT " . implode(',', $select); } else { return "SELECT " . $select; } } /** * @param $table * @return string */ public function getColumn($table) { return 'SHOW FULL FIELDS FROM ' . $table; } }