Files
kiri-core/Database/Orm/Select.php
T
2020-08-31 12:38:32 +08:00

105 lines
1.8 KiB
PHP

<?php
namespace Database\Orm;
use Snowflake\Abstracts\BaseObject;
use Database\ActiveQuery;
use Database\Sql;
use Database\Db;
use Exception;
/**
* Class Select
* @package Database\Orm
*/
class Select extends BaseObject
{
use Condition;
/**
* @param ActiveQuery|Db|Sql $query
* @return string
* @throws Exception
*/
public function getQuery($query)
{
return $this->generate($query, false);
}
/**
* @param ActiveQuery|Db $query
* @return string
* @throws Exception
*/
public function count($query)
{
return $this->generate($query, true);
}
/**
* @param ActiveQuery|Db|Sql $query
* @param $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;
}
}