Форум → Разработка → Базы данных → Срачь из темы про goDB
Срачь из темы про goDB
-
-
15 сентября 2010 г. 14:26, спустя 9 минут 33 секунды
я вообще в случае с query($sql, $params) за query bilder. Для тех кто в такне, что то типа такого:<?php
/**
* @package Query.php
* @version 1.0
* @author Konstantin Gerasimov
* @copyright Copyright © 2009, Konstantin Gerasimov
* @license LGPL
*/
class Query {
const SELECT = 'Select';
const INSERT = 'Insert';
const UPDATE = 'Update';
const DELETE = 'Delete';
const ASC = 'ASC';
const DESC = 'DESC';
/**
* @var array
*/
private $_Tables;
/**
* @var array
*/
private $_Fields;
/**
* @var array
*/
private $_Functions;
/**
* @var array
*/
private $_Values;
/**
* @var array
*/
private $_Joins;
/**
* @var array
*/
private $_Where;
/**
* @var array
*/
private $_Orders;
/**
* @var string
*/
private $_Limit;
/**
* @var int
*/
private $_Type;
/**
* @var array
*/
private $_Binds;
/**
* @var string
*/
private $_Sql;
/**
* @param string $QueryType self::SELECT
*/
public function __construct($QueryType = self::SELECT)
{
if (($QueryType !== self::SELECT) &&
($QueryType !== self::INSERT) &&
($QueryType !== self::UPDATE) &&
($QueryType !== self::DELETE)) {
throw new Exception('Unknown type of Query "' . $QueryType . '"');
}
$this->_Type = $QueryType;
$this->_Tables = array();
$this->_Values = array();
$this->_Fields = array();
$this->_Functions = array();
$this->_Joins = array();
$this->_Where = array();
$this->_Orders = array();
$this->_Limit = NULL;
$this->_Binds = array();
$this->_Sql = NULL;
}
/**
* @param string $TableName
* @param string $FieldName
* @param string $FieldAlias ''
* @param string $TableAlias ''
* @return Query
*/
public function AddField($TableName, $FieldName, $FieldAlias = '', $TableAlias = '')
{
$this->_ClearSqlCache();
if(empty($FieldName) || empty($TableName)) {
throw new Exception('Empty FeildName ="' . $FieldName . '" or/and TableName="' . $TableName . '"');
}
$FieldName = Str::Strtolower($FieldName);
$TableName = Str::Strtolower($TableName);
$FieldAlias = Str::Strtolower($FieldAlias);
$TableAlias = Str::Strtolower($TableAlias);
$Key = $TableName . '|' . $FieldName . '|' . $FieldAlias . '|' . $TableAlias;
if (!isset($this->_Fields[$Key])) {
$this->_Fields[$Key] = array($TableName, $FieldName);
if (!empty($FieldAlias)) {
$this->_Fields[$Key][] = $FieldAlias;
if (!empty($TableAlias)) {
$this->_Fields[$Key][] = $TableAlias;
}
}
}
return $this;
}
public function ClearFields()
{
$this->_Fields = array();
}
/**
*
* @param string $FieldName
* @param mixed $Value
* @param string $Format
* @return Query
*/
public function AddValue($FieldName, $Value, $Format)
{
$this->_ClearSqlCache();
if (!Db::IsDbFormat($Format)) {
throw new Exception('Unknown db format "' . $Format . '"');
}
$this->_Values[Str::Strtolower($FieldName)] = array($Value, $Format);
return $this;
}
/**
* @param string $TableName
* @param string $TableAlias ''
* @return Query
*/
public function AddTable($TableName, $TableAlias = '')
{
$this->_ClearSqlCache();
$Key = $TableName . '|' . $TableAlias;
if (!isset($this->_Tables[$Key])) {
$this->_Tables[$Key] = $TableName;
if (!empty($TableAlias)) {
$this->_Tables[$Key] = array($TableName, $TableAlias);
}
}
return $this;
}
/**
* @param string $WhereString
* @param array $Binds array()
* @return Query
*/
public function AddWhere($WhereString, $Binds = array())
{
$this->_ClearSqlCache();
if (empty($WhereString)) {
throw new Exception('Empty where string');
}
if (!is_array($Binds)) {
throw new Exception('Binds is not an array');
}
$this->_Where[] = array($WhereString, $Binds);
return $this;
}
/**
* @param string $JoinString
* @param array $Binds array()
* @return Query
*/
public function AddJoin($JoinString, $Binds = array())
{
$this->_ClearSqlCache();
if (empty($JoinString)) {
throw new Exception('Empty join string');
}
if (!is_array($Binds)) {
throw new Exception('Binds is not an array');
}
$Key = $JoinString . md5(serialize($Binds));
if (!isset($this->_Joins[$Key])) {
$this->_Joins[$Key] = array($JoinString, $Binds);
}
return $this;
}
/**
* @param string $Type
* @param string $TableName
* @param string $FieldName
* @param string $FieldAlias ''
* @param string $TableAlias ''
* @return Query
*/
public function AddOrder($Type, $TableName, $FieldName, $FieldAlias = '', $TableAlias = '')
{
$this->_ClearSqlCache();
if (($Type !== self::ASC) &&
($Type !== self::DESC)) {
throw new Exception('Wrong order type "' . $Type . '"');
}
$Key = $TableName . '|' . $FieldName . '|' . $FieldAlias . '|' . $TableAlias . '|' . $Type;
if (!isset($this->_Orders[$Key])) {
$this->_Orders[$Key] = array($Type, $TableName, $FieldName);
if (!empty($FieldAlias)) {
$this->_Orders[$Key][] = $FieldAlias;
if (!empty($TableAlias)) {
$this->_Orders[$Key][] = $TableAlias;
}
}
if (!empty($TableAlias) && empty($FieldAlias)) {
$this->_Orders[$Key][] = NULL;
$this->_Orders[$Key][] = $TableAlias;
}
}
return $this;
}
/**
* @param string $FunctionString
* @param array $Binds
* @param string $FunctionAlias ''
* @return Query
*/
public function AddFunction($FunctionString, $Binds = array(), $FunctionAlias = '')
{
$this->_ClearSqlCache();
if (empty($FunctionString)) {
throw new Exception('Empty function string');
}
if (!is_array($Binds)) {
throw new Exception('Binds is not an array');
}
$Key = $FunctionString . md5(serialize($Binds)) . $FunctionAlias;
if(!isset($this->_Functions[$Key])) {
$this->_Functions[$Key] = array($FunctionString, $Binds);
if (!empty($FunctionAlias)) {
$this->_Functions[$Key][] = $FunctionAlias;
}
}
return $this;
}
/**
* @param int $Count
* @param int $From 0
*/
public function SetLimit($Count, $From = 0)
{
$this->_ClearSqlCache();
if ($Count) {
$this->_Limit = array($Count, $From);
}
}
/**
* @return string
*/
public function GetSQL()
{
if (!$this->_Sql) {
$this->_Sql = $this->{'_Get' . $this->_Type . 'Sql'}();
}
return $this->_Sql;
}
/**
* @return array
*/
public function GetParams()
{
return $this->_Binds;
}
/**
* @return string
*/
public function __toString()
{
return htmlspecialchars($this->GetSQL());
}
/**
* @return string
*/
private function _GetSelectSql()
{
$this->_Binds = array();
$Sql = 'SELECT ' . Str::Strrepeat('?f,', count($this->_Fields));
foreach ($this->_Fields as $Sign) {
$this->_Binds[] = $Sign;
}
if (count($this->_Functions)) {
foreach ($this->_Functions as $Sign) {
$Sql .= $Sign[0] . ',';
if (count($Sign[1])) {
foreach ($Sign[1] as $Bind) {
$this->_Binds[] = $Bind;
}
}
}
}
$Sql = Str::Dec($Sql) . ' FROM ';
$Sql .= Str::Strrepeat('?t,', count($this->_Tables));
foreach ($this->_Tables as $Sign) {
$this->_Binds[] = $Sign;
}
$Sql = Str::Dec($Sql);
if (count($this->_Joins)) {
foreach ($this->_Joins as $Sign) {
$Sql .= ' ' . $Sign[0] . ' ';
if (count($Sign[1])) {
foreach ($Sign[1] as $Bind) {
$this->_Binds[] = $Bind;
}
}
}
}
if (count($this->_Where)) {
$Sql .= ' WHERE ';
foreach ($this->_Where as $Sign) {
$Sql .= ' ' . $Sign[0] . ' ';
if (count($Sign[1])) {
foreach ($Sign[1] as $Bind) {
$this->_Binds[] = $Bind;
}
}
}
}
unset($Sign);
if (count($this->_Orders)) {
$Sql .= ' ORDER BY ';
foreach ($this->_Orders as $Sign) {
$Type = array_shift($Sign);
$Sql .= ' ?f ' . $Type . ',';
$this->_Binds[] = $Sign;
}
$Sql = Str::Dec($Sql);
}
if ($this->_Limit) {
$Sql .= ' LIMIT ?i OFFSET ?i';
$this->_Binds[] = $this->_Limit[0];
$this->_Binds[] = $this->_Limit[1];
}
return $Sql;
}
/**
* @return string
*/
private function _GetInsertSql()
{
$this->_Binds = array();
$Sql = 'INSERT INTO ?t (';
$this->_Binds[] = array_shift($this->_Tables);
$Sql .= Str::Strrepeat('?f,', count($this->_Fields), TRUE);
foreach ($this->_Fields as $Sign) {
$this->_Binds[] = $Sign;
}
$Sql .= ') VALUES (';
foreach ($this->_Fields as $Sign) {
$Sql .= (isset($this->_Values[$Sign[1]]) ? $this->_Values[$Sign[1]][1] : Db::FORMAT_NULL) . ','; //FORMAT
$this->_Binds[] = (isset($this->_Values[$Sign[1]]) ? $this->_Values[$Sign[1]][0] : NULL); //real value
}
$Sql = Str::Dec($Sql) . ')';
return $Sql;
}
/**
* @return string
*/
private function _GetUpdateSql()
{
$this->_Binds = array();
$Sql = 'UPDATE ?t SET ';
$this->_Binds[] = array_shift($this->_Tables);
foreach ($this->_Fields as $Sign) {
$Sql .= '?f=' . (isset($this->_Values[$Sign[1]]) ? $this->_Values[$Sign[1]][1]: Db::FORMAT_NULL) . ',';
$this->_Binds[] = (isset($this->_Values[$Sign[1]]) ? $this->_Values[$Sign[1]][0] : NULL); //real value
}
$Sql = Str::Dec($Sql);
if (count($this->_Where)) {
$Sql .= ' WHERE ';
foreach ($this->_Where as $Sign) {
$Sql .= ' ' . $Sign[0] . ' ';
if (count($Sign[1])) {
foreach ($Sign[1] as $Bind) {
$this->_Binds[] = $Bind;
}
}
}
}
return $Sql;
}
private function _ClearSqlCache()
{
$this->_Sql = NULL;
}
}
А потом типа такого, "где-то в недрах" :$Query = new Query(Query::SELECT);
$Query->AddTable('user')
->AddField('user', 'login')
->AddValue('login', 'kostyl', Db::FORMAT_STR); //это вроде для Query::INSERT и UPDATE так что тут не отработает
$rs = Db::Query($Query->GetSQL(), $Query->GetParams());
Короче типа того. Я думаю так удобнее собирать запросы и параметры. -
-
15 сентября 2010 г. 14:23, спустя 4 минуты 36 секунд
что то типа такого:
ну и хуйня …. код полное дерьмоСапожник без сапог -
15 сентября 2010 г. 14:28, спустя 5 минут 39 секунд
phpdude, согласен, но дело не в коде, а в паттерне, потому как написать вручную запрос и параметры, который зависит от всяких условий, просто как строку и массив довольно напряжное дело. Эта хрень упрощает жизнь )) -
15 сентября 2010 г. 14:31, спустя 2 минуты 53 секунды
Эта хрень упрощает жизнь ))
ну это не подход, это жопа!)Сапожник без сапог -
15 сентября 2010 г. 14:36, спустя 5 минут 13 секунд
Насчёт ORM vs Builder vs native-SQL: кто из них лучше тема для обширного и бессмысленного холивара.
Каждый выбирает, что ему нравится, а после этого выбирает под это библиотеку.
goDB это библиотека для тех, кто выбрал нативный скл.
То что, у неё хуёвые плейсхолдеры или что-то ещё, это к ней, а то что ORM-форева, нет. -
-
15 сентября 2010 г. 14:47, спустя 6 минут 54 секунды
dая еDBAL
d2 DBAL - это тоже нативный sql если чеhttps://smappi.org/ - платформа по созданию API на все случаи жизни -
15 сентября 2010 г. 14:47, спустя 38 секунд
ну это не подход, это жопа!)
я имел в виду паттерн.
vasa_c, да конечно. Я например тоже пишу всё руками там где у меня есть мапперы. А там где у меня актив рекорды - квери билдер ахуенная вещью, как по мне. Ну смотря конечно что и как делать.
А вообще зачет за именованные плейсхолдеры -
15 сентября 2010 г. 14:49, спустя 1 минуту 31 секунду
я имел в виду паттерн.
а я про него и писал паттерн - JopaСпустя 23 сек.А вообще зачет за именованные плейсхолдеры
у меня всю жизнь {0}, {1}, {2} .. .))Сапожник без сапог -
-
-
15 сентября 2010 г. 14:56, спустя 1 минуту 4 секунды
Абырвалг, .net => String.Format(string patter, params object);Сапожник без сапог
Пожалуйста, авторизуйтесь, чтобы написать комментарий!