[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Как в ORM использовать sql-функции
McLotos
Всем привет. В общем написал небольшую ORM, с QueryBuilder'ом и остальными прелестями. Есть у нее 2 адаптера - для mysql и для postgresql, теперь когда захотелось использовать sql-функции, а я не знаю как это реализовать в ORM, потому-что для одних и тех же вещей у mysql и postgresql используются разные функции.

_____________
программирование - инструмент для решения конкретных задач, любая попытка спроектировать что-то универсальное приведет к провалу.©paul85
В любом случае тебе прийдётся пройти путь изобретения велосипеда, который прошли другие, только причиной твоего изобретения будет непонимание принципов работы велосипеда изобретённого другими людьми.©SlavaFr
jQuery это попытка использовать АН-225 для перевозки зубочистки
T1grOK
Можно создать одноименные обработчики функций для каждого из адаптеров.
Что то типа такого:

// Mysql
class GroupConcatFunction
{
public function getSql(GroupConcatExpression $expression)
{
return sprintf("GROUP_CONCAT(%s, %s)", $expression->getField(), $expression->getSeparator());
}
}


// Postgres
class GroupConcatFunction
{
public function getSql(GroupConcatExpression $expression)
{
return sprintf("string_agg(%s, %s)", $expression->getField(), $expression->getSeparator());
}
}


class Expression
{
protected $type;

protected $params = [];

public function __construct($type, $params)
{
$this->type;
$this->params = $params;
}

public function getType()
{
return $this->type;
}

public function getParams()
{
return $this->params;
}
}


class GroupConcatExpression
{
protected $field;

protected $separator;

public function __construct($field, $separator = ',')
{
$this->field = $field;
$this->separator = $separator;
}

public function getField()
{
return $this->field;
}

public function getSeparator()
{
return $this->separator;
}
}


class ExpressionFactory
{
public static function build($type, $params)
{
$className = $type.'Expression';
return (new ReflectionClass($className))->newInstanceArgs($params);
}
}


class FunctionFactory
{
public static function build($type)
{
$className = $type.'Function';
return new $className();
}
}


$queryBuilder = new QueryBuilder();
$queryBuilder->select(new Expression('GroupConcat', 'id', '-'));

// Формирование sql
$sql = '';
foreach ($this->selectFields as $field){
if($field instanceof Expression){
$expression = ExpressionFactory::build($field->getType(), $field->getParams());
$function = FunctionFactory::build($field->getType());
$sql .= $function->getSql($expression);
}
}



Естественно пример не претендует на полноту.
Для простых решений такое вполне подойдет, для более сложных придется разбивать запрос на лексемы и делать обработчики этих самых лексем.

_____________
Mysql, Postgresql, Redis, Memcached, Unit Testing, CI, Kohana, Yii, Phalcon, Zend Framework, Joomla, Open Cart, Ymaps, VK Api
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.