Что выбрать для работы с PHP - MySQL-ORM

Absinthe

жожо

AmdY

Пью пиво
Команда форума
Фанат, знаешь, у меня есть идея делать все эти методы квери билдера и файнеры protected, чтобы было понятно, что это хрень, которая юзаются внутри модели. В первой доктрине есть замечательный момент, который показывает суть ORM
PHP:
$q = new Doctrine_RawSql();
$q->select('{u.*}, {p.*}')
    ->from('user u LEFT JOIN phonenumber p ON u.id = p.user_id')
    ->addComponent('u', 'User u');
    ->addComponent('p', 'u.Phonenumbers p')
    ->execute();;
Делается обычный запрос, а затем его результат оборачивается в объекты.

StalkerClasses, вот не понимаю, выше дал тебе способ как расширить класс idiorm с которым у тебя была загвоздка http://phpclub.ru/talk/threads/Что-выбрать-для-работы-с-php-mysql-orm.77043/page-2#post-697435
затем ты не справился с компосером.
может тебе всё же основы прокачать, а не хвататься за библиотеки попонятнее на теперешнем уровне? это путь вникуда, сложности нужно преодолевать, а не ускользать, так как придтся делать огромный круг до нужных знаний.
 

StalkerClasses

Новичок
Фанат, знаешь, у меня есть идея делать все эти методы квери билдера и файнеры protected, чтобы было понятно, что это хрень, которая юзаются внутри модели. В первой доктрине есть замечательный момент, который показывает суть ORM
PHP:
$q = new Doctrine_RawSql();
$q->select('{u.*}, {p.*}')
    ->from('user u LEFT JOIN phonenumber p ON u.id = p.user_id')
    ->addComponent('u', 'User u');
    ->addComponent('p', 'u.Phonenumbers p')
    ->execute();;
Делается обычный запрос, а затем его результат оборачивается в объекты.

StalkerClasses, вот не понимаю, выше дал тебе способ как расширить класс idiorm с которым у тебя была загвоздка http://phpclub.ru/talk/threads/Что-выбрать-для-работы-с-php-mysql-orm.77043/page-2#post-697435
затем ты не справился с компосером.
может тебе всё же основы прокачать, а не хвататься за библиотеки попонятнее на теперешнем уровне? это путь вникуда, сложности нужно преодолевать, а не ускользать, так как придтся делать огромный круг до нужных знаний.
А смысл в чем - прокачивать этот idiorm - в файле исходников?
Если класс мало-расширяем - это уже ему в минус идет...

Все что хотелось и так сделал на основе NotORM.
И очень удобно с точки зрения восприятия построения запросов.

С точки зрения использования моделей (как к примеру мне очень понравился Active Records), это не всегда оправданно, создавать 1 файл на модель, 1 файл на скрипт (контроллер), 1 файл на шаблон. Вон люди в битриксе делают все в кучу, расставляя комментарии, и другое и даже работает не плохо... Другое дело если Вы пишите серьезный проект, более менее постоянный - типа биржы фриланса, сайта недвижимости... Он то спланирован...Там имеет смысл пребегать ко всему возможному арсеналу... А где работал с битриксом, там получается как - ты делаешь 1 шаг, приходит человек, смотрит, переделываем и так по кругу... И это даже не то, что тот, кто приходит человек на букву "М", а совсем на оборот, - просто пришла идея, добавили, пришла еще добавили. Думаю нормальный программист, (который уважает себя), не будет простые вещи делать сложными малоповоротных механизмах....

Что характерно - у авторов Флуента хватило ума показать пример как раз такого случая, когда использование билдера оправдано.
Авторы же ноторма радостно пишут эту вот ерунду
PHP:
$applications = $db->application()
->select("id, title")
->where("web LIKE ?", "http://%")
->order("title")
->limit(10)
;
там где нужна ровно одна строчка
PHP:
$apps = $db->getAll("SELECT id, title FROM application WHERE web LIKE ? ORDER BY title LIMIT 10", "http://%");
Мне визуально читается, всеравно первый вариант записи.

Ну а на будущее наверное для себя решил, что буду прибегать к какому ни будь фреймворку, и изучать только его...

Всех с наступающим Новым годом!
 
Последнее редактирование:

Absinthe

жожо
Используются магические методы.
Ты не знаешь, какие поля и методы есть у объекта. IDE тебе не помогает.
Ты тратишь больше времени на разработку.
 

Absinthe

жожо
StalkerClasses, зачем ты спрашиваешь инструмент, не читаешь ответ, а говоришь, что снова нашел очередную говнолибу?
 
  • Like
Реакции: WMix

HQ0

Новичок
Absinthe, что же мне делать, если я до сих пор не использую ИДЕ -- пользуюсь какими-то странными текстовыми редакторами вроде саблайма ?
Возможно стоит попробовать снова.

hell0w0rd, откуда же такая информация?
 

hell0w0rd

Продвинутый новичок
HQ0, какая информация?
Ну в блоге делятся своими впечатлениями, не особо реагируют на комментарии.. вот этот пост и есть блог:)
 
  • Like
Реакции: AmdY

StalkerClasses

Новичок
Да, что-то не везет мне с библиотеками.
Посмотрел - все замечательно в ней по функционалу, который необходим в запросах- http://fluentpdo.com/documentation.html#gettingStarted
Но, при попытке расширить стандартный класс уже на стадии коннекта по умолчанию -


PHP:
class MyDbFluentPDO extends FluentPDO {

    function __construct(PDO $pdo=null, FluentStructure $structure = null) {
        if ($pdo == false){
            $pdo = new PDO("mysql:dbname=".db.";host=".host, user, pass,
            array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
        }
        $this->pdo = $pdo;
        if (!$structure) {
            $structure = new FluentStructure;
        }
        $this->structure = $structure;
    }

}
Все отказывается работать...
А...

Из-за того, что в других файлах используются конструкции вида
PHP:
protected function __construct(FluentPDO $fpdo, $clauses) {
        $this->fpdo = $fpdo;
        $this->clauses = $clauses;
        $this->initClauses();
    }
Судя по всему данной библиотеке одной точки входа на подключение оказалось мало...

Пишет ошибку:
Call to a member function prepare() on a non-object in ... FluentPDO/BaseQuery.php on line 96
 

StalkerClasses

Новичок
По хорошему то что нужно сделать - что хотел бы....

а) устанавилвать дефолтовый коннект к БД (если не передан другой), структуру полей, а также кодировку UTF-8
б)У меня для многих таблиц есть общие логические поля

hide - скрыть(1)/показать(0)
trash - удаленность в корзину(1), если не удалено (0)
opentime- время открытия записи (дата)
closetime- время закрытия записи (дата)
доступ для групп (указывается группы, в которых числится запись)
локализация (вот здесь вообще начинается полный кошмар)...

Писать в ручную все это дело в каждом запросе - физически невозможно
Т.к. это все будет выглядеть от руки...

SELECT * FROM myContent WHERE
...
hide = 0 AND trash = 0 AND opentime ... AND clossetime AND access=IN(0,1,2,3) AND (localiz - вообще очень сложно написать каждый раз правильно без ошибок)....
....

Вот такие вот запросы...
И писать их каждый раз руками нууу очень сложно - хочу сделать, что бы это было все автоматизировано.
В NotORM - у меня получилось это сделать, но там нет join... к примеру.


Поэтому по умолчанию делая запрос вида:
$fpdo->from('myContent')->select('name');

Запрос по умолчанию делается уже с учетом всех этих hide, trash...
Если нужно что-то отключить, делается так:
$fpdo->from('myContent')->select('name')->disableSpesilField("hide,trash,localization");
 

hell0w0rd

Продвинутый новичок
StalkerClasses, прекрати пытаться сделать какую-то хрень. Либа принимает PDO - по моему замечательно.
Создаешь экземпляр PDO, инжектишь его в флюент свой и работаешь.
Вот тот код что ты написал - неподдерживаемая трудноразберимая хренота.
А что если константы не объявлены? а что если подключение через сокет? а что если не utf8? А также это можно сделать проще - в dsn дописать charset=utf8
И да.
Надо вызывать родительский конструктор. Всегда!

Бери доктрину/eloquent/yii::AR, что угодно, где есть наследование моделей и будет у тебя одна логика на все
 

StalkerClasses

Новичок
StalkerClasses, прекрати пытаться сделать какую-то хрень. Либа принимает PDO - по моему замечательно.
Создаешь экземпляр PDO, инжектишь его в флюент свой и работаешь.
Вот тот код что ты написал - неподдерживаемая трудноразберимая хренота.
А что если константы не объявлены? а что если подключение через сокет? а что если не utf8? А также это можно сделать проще - в dsn дописать charset=utf8
И да.
Надо вызывать родительский конструктор. Всегда!
Либа очень понравилась.
Сейчас попробую конструктор родительский вызвать...
Только в чем смысл? - я же переписал конструктор.
 

hell0w0rd

Продвинутый новичок
StalkerClasses, учи матчасть. Нельзя переписать конструктор, ты обязан вызвать родительский
Конструктор создает объект, он отвечает за то что в дальнейшем с объектом можно будет работать
Да и код твой сократится от вызова родительского конструктора
 

StalkerClasses

Новичок
hell0w0rd - ооо - заработало.
Вызвал конструктор:
PHP:
class MyDbFluentPDO extends FluentPDO {

    function __construct(PDO $pdo = null, FluentStructure $structure = null) {
        if ($pdo == false){
            $pdo = new PDO('mysql:host=localhost;dbname=db',"user","pass",
                            array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8") );
        }
        parent::__construct($pdo, $structure);
    }

}
 
Сверху