ФорумРазработкаБазы данных → Срачь из темы про goDB

Срачь из темы про goDB

  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 15 сентября 2010 г. 14:14

    а я вот постепенно отказываюсь от своих либ для работы с базой. Да, это все удобно, но нужно следовать стандартам
    Спустя 25 сек.
    хотя буду задрачивать доктриновцев что б они добавили некоторые фичи
  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz 15 сентября 2010 г. 14:17, спустя 2 минуты 37 секунд

    что для тебя стандарт?
    ιιlllιlllι унц-унц
  • kostyl

    Сообщения: 5210 Репутация: N Группа: Джедаи

    Spritz 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());

    Короче типа того. Я думаю так удобнее собирать запросы и параметры.
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 15 сентября 2010 г. 14:18, спустя 23 часа 51 минуту 58 секунд

    Doctrine2DBAL на основе PDO который
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 15 сентября 2010 г. 14:23, спустя 4 минуты 36 секунд

    что то типа такого:

    ну и хуйня …. код полное дерьмо
    Сапожник без сапог
  • kostyl

    Сообщения: 5210 Репутация: N Группа: Джедаи

    Spritz 15 сентября 2010 г. 14:28, спустя 5 минут 39 секунд

    phpdude, согласен, но дело не в коде, а в паттерне, потому как написать вручную запрос и параметры, который зависит от всяких условий, просто как строку и массив довольно напряжное дело. Эта хрень упрощает жизнь ))
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 15 сентября 2010 г. 14:31, спустя 2 минуты 53 секунды

    Эта хрень упрощает жизнь ))

    ну это не подход, это жопа!)
    Сапожник без сапог
  • vasa_c

    Сообщения: 3131 Репутация: N Группа: в ухо

    Spritz 15 сентября 2010 г. 14:36, спустя 5 минут 13 секунд

    Насчёт ORM vs Builder vs native-SQL: кто из них лучше тема для обширного и бессмысленного холивара.
    Каждый выбирает, что ему нравится, а после этого выбирает под это библиотеку.
    goDB это библиотека для тех, кто выбрал нативный скл.
    То что, у неё хуёвые плейсхолдеры или что-то ещё, это к ней, а то что ORM-форева, нет.
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 15 сентября 2010 г. 14:40, спустя 3 минуты 34 секунды

    d2 DBAL - это тоже нативный sql если че
  • adw0rd

    Сообщения: 22959 Репутация: N Группа: в ухо

    Spritz 15 сентября 2010 г. 14:47, спустя 6 минут 54 секунды


    d2 DBAL - это тоже нативный sql если че
    dая еDBAL
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • kostyl

    Сообщения: 5210 Репутация: N Группа: Джедаи

    Spritz 15 сентября 2010 г. 14:47, спустя 38 секунд

    ну это не подход, это жопа!)

    я имел в виду паттерн.
    vasa_c, да конечно. Я например тоже пишу всё руками там где у меня есть мапперы. А там где у меня актив рекорды - квери билдер ахуенная вещью, как по мне. Ну смотря конечно что и как делать.
    А вообще зачет за именованные плейсхолдеры
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 15 сентября 2010 г. 14:49, спустя 1 минуту 31 секунду

    я имел в виду паттерн.

    а я про него и писал паттерн - Jopa
    Спустя 23 сек.
    А вообще зачет за именованные плейсхолдеры

    у меня всю жизнь {0}, {1}, {2} .. .))
    Сапожник без сапог
  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz 15 сентября 2010 г. 14:51, спустя 1 минуту 51 секунду

    засрали тему
    ιιlllιlllι унц-унц
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 15 сентября 2010 г. 14:55, спустя 4 минуты 4 секунды

    у меня всю жизнь {0}, {1}, {2} .. .))

    Java way?
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 15 сентября 2010 г. 14:56, спустя 1 минуту 4 секунды

    Абырвалг, .net => String.Format(string patter, params object);
    Сапожник без сапог

Пожалуйста, авторизуйтесь, чтобы написать комментарий!