Просоветуйте класс бд

fixxxer

К.О.
Партнер клуба
PHP:
$stmt = $conn->executeQuery('SELECT * FROM articles WHERE id IN (?, ?, ?, ?, ?, ?)',
    array(1, 2, 3, 4, 5, 6),
    array(\PDO::PARAM_INT, \PDO::PARAM_INT, \PDO::PARAM_INT, \PDO::PARAM_INT, \PDO::PARAM_INT, \PDO::PARAM_INT)
);
Адище.

Вообще доктриновский dbal явно в основном написан как низкоуровневый pdo-враппер для использования как библиотеки вовнутрях orm.

Само по себе это так же неюзабельно, как и pdo.
 

keltanas

marty cats
так под этим и подпись стоит
This is much more complicated and is ugly to write generically.
так что ай-яй-яй ))
Само по себе это так же неюзабельно, как и pdo.
да как и остальные "database abstraction & access layer", но дальше по мануалу начинаются более интересные вещи
 
Последнее редактирование:

WMix

герр M:)ller
Партнер клуба
hell0w0rd, keltanas, ничего личного, просто задумался откуда такая точность )
Absinthe
, не ты ли пропагандируешь границу говнокодности и удобство решений этим инструментом? да все писать нет смысла, но можно быстренько сверстать довольно мощную основу.
 

fixxxer

К.О.
Партнер клуба
так под этим и подпись стоит
Стоит. Но все остальные присутствующие там способы задать тип аргумента еще более бесчеловечны.

Интересным ты называешь fetchArray? О да, до доктрины никто не додумался, бггг.

Когда используешь ORM и очень изредка надо сделать raw query, это все терпимо. Но если ORM вообще не используется, есть куча куда более подходящих библиотек.

А вообще, то, что единственная поддерживаемая и развиваемая php-реализация DataMapper - это кривой монстр Doctrine2, это печально.
 

Absinthe

жожо
Absinthe, не ты ли пропагандируешь границу говнокодности и удобство решений этим инструментом? да все писать нет смысла, но можно быстренько сверстать довольно мощную основу.
Когда пытаются сделать легкое изящное решение, внеся туда заведомый небольшой кусочек говнокода ради удобства - я за.
Когда же пишут жуткого энтерпрайзного монстра, но из-за отсутсвия определенного количества навыков говнокодят, в результате чего получается подобный франкенштейн, - против.
 

Absinthe

жожо
hell0w0rd, отсутствие тестов не означает, что приложение плохое.
Но означает, что стоимость поддержки сильно возрастает, любой фикс бага может (и часто приводит) к новому багу.

не более, чем в какой-либо другой библиотеке ))
Я давно не видел популярных библиотек такого качества :) Код - жуть. Дублирование, непроверенные куски и т.д.
 

keltanas

marty cats
А вообще, то, что единственная поддерживаемая и развиваемая php-реализация DataMapper - это кривой монстр Doctrine2, это печально.
С этим, пожалуй, соглашусь. Но, это не заставит меня и под дулом пистолета использовать AR со статикой.
Всегда можно сказать, что чужой код далек от идеала. Но, что мешает написать лучшую реализацию? Видимо тем, чем автор пожертвовал, а мы не можем. Своим драгоценным временем, которое должно конвертироваться в наше благосостояние.
 

fixxxer

К.О.
Партнер клуба
Ну, вообще говоря, то, что мы видим в Yii2 и Eloquent, это не совсем AR (обсуждали где-то год назад). Это скорее такой кастрированный автоматический Data Mapper, автоматически создаваемый для данной модели, и снаружи делающий вид, что он - AR (но если присмотреться - снаружи мы получаем коллекции и билдеры - а это уже не AR ;)). AR в каноничном виде не умеет коллекции и связи, и все в одном классе. Полноценным DM это, конечно, не является.
 

keltanas

marty cats
Согласно ISBN 978-5-8459-1611-2
Активная запись (Active Record):
Объект, выполняющий роль оболочки для строки таблицы или представления базы данных. Он инкапсулирует доступ к базе данных и добавляет к данным логику домена.
...При необходимости вы можете применить отображение внешних ключей (Foreign Key Mapping, 258)...

Преобразователь данных (Data Mapper):
Слой преобразователей (Mapper, 489), который осуществляет передачу данных между объектами и базой данных, сохраняя последние независимыми друг от друга и от самого преобразователя.

AR умеет все, что в него засунут. По определению это объект, содержащий доменную логику и умеющих сам себя удовл... сохранять и доставать.
Билдеры и коллекции непосредственной связи не имеют ни с AR, ни с DM.
 

fixxxer

К.О.
Партнер клуба
Да-да, вот именно это и обсуждали. Общие слова есть, а вообще Фаулер приводит примитивнейшую реализацию, про "FK mappping" есть оговорка в одну строчку типа "если очень хочется, то можно", демонстрируется же FK mapping на примере DM.
 

keltanas

marty cats
Но, типовое решение != конкретная реализация. Каждая конкретная реализация может включать множество типовых решений, комбинируя их так, как решит автор.
Отсюда и не значит, что AR, которую напичкали другими паттернами перестает быть AR только потому, что Фаулер не показал примера использования ))
 

fixxxer

К.О.
Партнер клуба
Вопрос в том, считать ли настройку квери-билдера "инкапсуляцией доступа к базе". Сама-то модель уже давно нигде в базу не ходит.
 

Absinthe

жожо
Всегда можно сказать, что чужой код далек от идеала. Но, что мешает написать лучшую реализацию? Видимо тем, чем автор пожертвовал, а мы не можем. Своим драгоценным временем, которое должно конвертироваться в наше благосостояние.
Разве то, что профессионалы не потратили время на качественную альтернативу доктрине, означает, что код доктрины нормальный?
 

keltanas

marty cats
Absinthe, что же, могу только присоединиться ко мнению:
http://phpclub.ru/talk/threads/77880/page-3#post-705435
Если уже код доктрины плохой, то где тогда хороший код?
Сама-то модель уже давно нигде в базу не ходит.
Это уже скорее философский вопрос. Ходит не сама модель, а делегирует другим. Но, по большому счету она в любом случае делегирует, будет там mysql_*, или какой-то объект. Разницы же нет.
PHP:
$user = User::find(1);
$user->email = '[email protected]';
$user->save();
В чем принципиальная разница между:
PHP:
    /**
    * Find a model by its primary key.
    *
    * @param mixed $id
    * @param array $columns
    * @return \Illuminate\Database\Eloquent\Model|Collection|static
    */
    public static function find($id, $columns = array('*'))
    {
        if (is_array($id) && empty($id)) return array();

        $result = mysql_query('SELECT '.join(',', $columns).' FROM ' . self::$table . ' WHERE id = ' . $id);
        return mysql_fetch_object($result);
    }

    /**
    * Find a model by its primary key.
    *
    * @param mixed $id
    * @param array $columns
    * @return \Illuminate\Database\Eloquent\Model|Collection|static
    */
    public static function find($id, $columns = array('*'))
    {
        if (is_array($id) && empty($id)) return new Collection;

        $instance = new static;

        return $instance->newQuery()->find($id, $columns);
    }
 
Последнее редактирование:

hell0w0rd

Продвинутый новичок
Absinthe, не надо себя обманывать, в Eloquent такой же говнокод, если не хуже.
https://github.com/illuminate/database/blob/master/Query/JoinClause.php#L60
В доктрине бардак в классах, но в целом более-менее. Особенно если с ней долго работать и запомнить некоторые нюансы) Но то что в доктрине говнокод - я не отрицаю, просто действительно альтернатив нет
 

fixxxer

К.О.
Партнер клуба
А где тут говнокод? Ну compact и compact, не вижу ничего криминального, когда он сразу после аргументов, а не через 50 строк.
 

keltanas

marty cats
Absinthe, ты покажи, какая задача в доктрине решается гавнокодом, а в Eloquent та же академически правильно? А то утверждать, что все гавно я тоже могу сколько хочешь.
 
Сверху