За последние 24 часа нас посетили 18248 программистов и 1651 робот. Сейчас ищут 1580 программистов ...

Есть ли в природе ... ?

Тема в разделе "Решения, алгоритмы", создана пользователем r00les, 8 фев 2010.

  1. r00les

    r00les Активный пользователь

    С нами с:
    4 сен 2009
    Сообщения:
    142
    Симпатии:
    0
    Есть ли ОРМ которые могут связывать три, две таблицы в виде модулей, например:

    Если три таблицы:

    книги
    читатели
    журнал
    ------------
    модуль Библиотека.

    И что бы в дальнейшем я работал с ним ( модулем ) так:

    megaORM::get ( 'library' ) -> books ( $id ).
    ---------------------------------------------------
    id: 1
    Антон Фиглиф - преступление и преступление
    Читает Крупкин Вадим, Пранкин Саша
    Журнал: брали тогда то и тогда то
     
  2. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    r00les
    Если вам Doctrine не подойдёт (или не дай бог не умеет того чего вы хотите), то нет
     
  3. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    она умеет, впрочем, если мне не изменяет память это умеет и Propel, и Hibernate и многие другие.

    Это в какой-то степени умеет даже моя корявая модель
    PHP:
    1. <?php
    2.     public function selectWithPreDefinedSelect(Zend_Db_Select $select = null, $withFromPart=self::SELECT_WITHOUT_FROM_PART)
    3.     {
    4.         if (!$select) {
    5.             $select = $this->select(true);
    6.         }
    7.         $select->setIntegrityCheck(false);
    8.         $refList = $this->getFullInfoReferenceList();
    9.         $depth = $this->getFullInfoDepth();
    10.         if ($this->isFullInfo() && $refList && $depth) {
    11.             $depth--;
    12.             foreach ($refList as $refName) {
    13.                 $refInfo = $this->getReferenceByRuleKey($refName);
    14.                 $fieldName = $refInfo['columns'];
    15.                 $mapper = $this->getReferenceMapperByRefName($refName);
    16.                 $select->join(
    17.                         $mapper->info('name'),
    18.                         $this->getAdapter()->quoteIdentifier($this->info('name')) . '.' .
    19.                         $this->getAdapter()->quoteIdentifier($fieldName) . ' = ' .
    20.                         $this->getAdapter()->quoteIdentifier($mapper->info('name')) . '.' .
    21.                         $this->getAdapter()->quoteIdentifier($refInfo['refColumns']));
    22.                 $select = $mapper->setFullInfoDepth($depth)->enableFullInfo()->selectWithPreDefinedSelect($select)->setIntegrityCheck(false);
    23.             }
    24.         }
    25.         return $select;
    26.     }
    PHP:
    1. <?php
    2.         $grid = new Widget_SimpleGrid();
    3.         //$model = new Model_Mapper_Address();
    4.         $model = new Model_Mapper_Location();
    5.         $model->enableFullInfo();
    6.         $model->setFullInfoDepth(3);
    7.        
    8.         $grid->createFromModel($model);
    9.         $grid->prepareNavigationFromParams($this->_request->getParams());
    10.         echo $grid;
    Запрос на выборку без лимитов грида
    [sql]SELECT `location`.*, `customer`.*, `location_type`.* FROM `location`
    INNER JOIN `customer` ON `location`.`customer_id` = `customer`.`customer_id`
    INNER JOIN `location_type` ON `location`.`location_type` = `location_type`.`location_type`[/sql]
     
  4. r00les

    r00les Активный пользователь

    С нами с:
    4 сен 2009
    Сообщения:
    142
    Симпатии:
    0
    Simpliest

    Так, я так понял это вы под конкретный случай пример привели, а насколько гибкой она окажется ? возможно ли создавать подобные модули на "лету" ?. Напрмиер:


    $this->library = ORM::tables ( "users", "books" ) -> bind ( "idusers", "idbooks" );

    $this->library->books->login ( 'r00les' );

    >> r00les | Данте ( Божественная комедия )
     
  5. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    PHP:
    1. <?php
    2.     protected $_referenceMap = array(
    3.         'weight_measure' => array(
    4.             'columns' => 'weight_measure',
    5.             'refTableClass' => 'Model_Mapper_WeightMeasure',
    6.             'refColumns' => 'weight_measure_id'
    7.             ),
    8.         'volume_measure' => array(
    9.             'columns' => 'volume_measure',
    10.             'refTableClass' => 'Model_Mapper_VolumeMeasure',
    11.             'refColumns' => 'volume_measure_id'
    12.             ),
    13.         'auto_type_id' => array(
    14.             'columns' => 'auto_type_id',
    15.             'refTableClass' => 'Model_Mapper_AutomobileType',
    16.             'refColumns' => 'auto_type_id'
    17.             ),
    18.         'location_id' => array(
    19.             'columns' => 'location_id',
    20.             'refTableClass' => 'Model_Mapper_Location',
    21.             'refColumns' => 'location_id'
    22.             )
    23.         );
    Напишешь сеттер для этой ерунды и будет у тебя "на лету".

    Впрочем стандартный Zend_Db_Table обладает этой же функцией из коробки, только несколько другими средствами.
    Только как для меня "на лету" оказалось слишком многословным.
     
  6. r00les

    r00les Активный пользователь

    С нами с:
    4 сен 2009
    Сообщения:
    142
    Симпатии:
    0
    Simpliest


    А мо ж ещё ОС написать ? Я говорил о том что бы не блыо от программиста лишнего кода типа сетера, гетера, хуетера ( простите )
     
  7. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Все я пас.

    Ну не перевариваю я идиотов.
     
  8. r00les

    r00les Активный пользователь

    С нами с:
    4 сен 2009
    Сообщения:
    142
    Симпатии:
    0
    Simpliest

    Отвратительно себя показали тут вы:

    1) Считая себя умнее
    2) Переходите на личности
    3) Не уважительно относитесь к незнакомым вам людям общаясь на "ТЫ"



    И ещё:

    # $grid = new Widget_SimpleGrid();
    # //$model = new Model_Mapper_Address();
    # $model = new Model_Mapper_Location();
    # $model->enableFullInfo();
    # $model->setFullInfoDepth(3);
    #
    # $grid->createFromModel($model);
    # $grid->prepareNavigationFromParams($this->_request->getParams());

    -----------------------------------------------------------------------------------------------------

    Ваш пример выше выглядел как минимум не красиво и не читабельно, как минимум. Если да же сравнивать с тем что приводил и хотел увидеть я. Если вы считаете что они равны, то пусть для вас так и будет.
     
  9. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    r00les, убейся.
    Мне плевать как я выгляжу, мне важен факт, что собеседник идиот не понимающий о чем речь, а значит с ним нельзя ничего обсуждать.

    Если человек тупо не знает что такое сеттер и это для него является чем-то заоблачным и сопоставимым с написанием ОС, то о чем может идти речь? О каких ОРМ? Не смешите мои тапочки.

    Для альтернативно-одаренных, популярно объясняю. Вот это внутренняя реализация связывания в моделях:
    А вот это, как оно используется в коде:
    PHP:
    1. <?php
    2. $model = new Model_Mapper_Location();
    3. $model->enableFullInfo()->setFullInfoDepth(4)->fetchAll()->toArray()
    Извлечение графа по всем ветвям на глубину 4

    PHP:
    1. <?php
    2. $model->enableFullInfo()->setFullInfoReferenceList(array('user_id', 'offer_id'))->fetchAll()->toArray()
    Извлечение графа по ветвям user_id, offer_id на глубину 1

    При этом меня абсолютно не интересуют особенности реализации хранения отдельных моделей в БД и как они себя получают из 1й или 10ти таблиц.
    Я получаю граф объектов, который одним движением сериализуется в XML, массив или еще в что-то, буде мне того пожелается.
    При этом весь код для работы с этим генерируется автоматически по описанию структуры.

    Но чтобы это понимать, надо хотя бы вдуматься в то что показали, куда как проще работать языком и корчить из себя обиженную невинность.
     
  10. r00les

    r00les Активный пользователь

    С нами с:
    4 сен 2009
    Сообщения:
    142
    Симпатии:
    0
    Simpliest

    Я с вами согласен и замечу, что тему открыл я. Поверте я изучил те или иные материалы прежде чем это сделать.

    Вы мне отвратительны, ваши доводы не убедительны, а объяснения никчёмные.

    Ещё раз повторюсь, я тут обсуждаю ОРМ которая не предполагает ничего писать, а вся работа осуществляется через её классы и объекты. Я не могу ничего сделать если вы меня не понимаете. Просто это тема не для вас.

    Ещё раз показывает высоту вашего интеллекта.


    --------------------------------------------------------------------------------------------------------------------------
    По делу, я привёл пример в одну строчку того, чего я хочу увидеть от функционала ORM
    --------------------------------------------------------------------------------------------------------------------------
    PHP:
    1. $this->library = ORM::tables ( "users", "books" ) -> bind ( "idusers", "idbooks" );
    2.  
    3. $this->library->books->login ( 'r00les' );
    4.  
    А теперь вопрос, код который вверху ( мой ), читабельные и понятнее вашего ?
     
  11. r00les

    r00les Активный пользователь

    С нами с:
    4 сен 2009
    Сообщения:
    142
    Симпатии:
    0
    Simpliest

    И ещё, меня не интересуют предварительные конфиги связываний и правил которыми вы тут кидаетесь. Я вообще в коде бы не хотел видеть конфиги иначе проще писать SQL-запрос так как он прозрачнее потому, что случаи бывают и очень часто такие, что:

    1) Я неделю не кодил модуль и мне нужно лезть в конфиги что бы смотреть что с чем я там связывал.
    2) Код мне передал другой программист, что в двойне сложнее
     
  12. r00les

    r00les Активный пользователь

    С нами с:
    4 сен 2009
    Сообщения:
    142
    Симпатии:
    0
    Это форум, где люди общаются посредством передачи текстовой информации. Мистер умник. Я то же могу по умничать.
     
  13. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    не, тут еще и телепаты бывают.
     
  14. r00les

    r00les Активный пользователь

    С нами с:
    4 сен 2009
    Сообщения:
    142
    Симпатии:
    0
    440Hz

    и мистреы - "я знаю то, что другие не знают".
     
  15. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    А не меряйтесь высотой :) Тогда не будет мучительно больно за свою низость :)

    Йо диджей, продолжаем писать глупости? :)

    Это мифический код, которого банально даже нет еще :)

    А это реальный рабочий код.
    PHP:
    1. <?php
    2. $library = $model->enableFullInfo()->setFullInfoReferenceList(array('users_id', 'books_id'))->fetchAll();
    А вот он же, после переименования методов(хотя их названия отдельная песня) и небольшого рефакторинга (найдите 10ть отличий от своих "хотелок")
    PHP:
    1. <?php
    2. $library = new Model_Mapper_Library();
    3. $library->bind(array('users_id', 'books_id'));
    4. $library->books->login('дурашка r00les');
    5.  
    6. //а можно и так
    7. $library->bind(array('users_id', 'books_id'))->books->login('дурашка r00les');
    8.  
    9. //а можно даже так, только за такое я бы руки поотрывал.
    10. $library->addReference('школьники', 'login', 'Model_Школьники_Mapper', 'школьники_ид', $onDelete, $onUpdate)->bind('школьники')->school('интернат одаренных')
    11.  
    И да, 99% этого функционала из коробки, я лишь допилил методы под свой стиль.

    Еще вопросы чудо?
     
  16. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Не хочешь не видь.
    У меня они автоматически генерируются по структуре БД, с тем чтобы при работе на запрашивать метаинформацию в БД каждый раз. И наружу видны только на чтение, почему я и предлагал желающим писать свои сеттеры.
    Опа :)

    А в этих случаях вы телепатически поймете что у books есть какой-то метод login() который еще чего-то там и ищет? :)

    В моем случае все модели имеют полный автокомплит в IDE ибо магические методы не перегружаются функционалом (есть конечно тяжелое наследие отцов основателей в виде Zend_Db_Table, но все новые методы полностью показываются)

    А у вас? :)

    Подсказка после каждой стрелочки будет? :) Что-то мне говорит - нет....
    Опа - два :)

    Так чей код понятнее?
     
  17. r00les

    r00les Активный пользователь

    С нами с:
    4 сен 2009
    Сообщения:
    142
    Симпатии:
    0
    Simpliest

    Нет, вот так: $this->library = ORM::tables ( "users", "books" ) -> bind ( "idusers", "idbooks" );

    где: объект библиотека знает о таблицах "users" и "books" а так же знает, что связывать их нужно по двум полям "idusers" и "idbooks". Отношения полей к таблицам определяется позицией разделённой запятой.

    Опа :) и никаких автохуегенераторов.
     
  18. r00les

    r00les Активный пользователь

    С нами с:
    4 сен 2009
    Сообщения:
    142
    Симпатии:
    0
    Simpliest

    И мы ж не дураки, что бы кодить не зная какие поля есть у таблицы и что в них находится.
     
  19. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Объект-то может и знает...
    Но для написания вот этого
    об этом должен знать программист. Поскольку автокомплита у тебя 0 целых.

    Дураки, не дураки - но не знаете ибо:
    Так что глупые школьники - 100%

    Ибо
    [​IMG]
    И держи себе это в памяти до позеленения.

    А к моменту готовности оно вырастет еще на 15ть таблиц.
     
  20. r00les

    r00les Активный пользователь

    С нами с:
    4 сен 2009
    Сообщения:
    142
    Симпатии:
    0
    Simpliest

    Скажите, вас интересуют творческие подходы к решению задач ? или вы любитель "подрочить" на википедию ?
     
  21. r00les

    r00les Активный пользователь

    С нами с:
    4 сен 2009
    Сообщения:
    142
    Симпатии:
    0
    Simpliest

    Код (Text):
    1.  
    2. $library = new Model_Mapper_Library();
    3. $library->bind(array('users_id', 'books_id'));
    4. $library->books->login('великолепный Simpliest');
     
  22. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Покажите мне их :)

    Я пока вижу сплошную распальцовку без базы знаний и опыта. Хочешь гнуть пальцы - изволь соответствовать по всем качествам.

    Меня больше интересуют девушки :) А это занятие я оставляю вам - школьникам :)
     
  23. r00les

    r00les Активный пользователь

    С нами с:
    4 сен 2009
    Сообщения:
    142
    Симпатии:
    0
    Simpliest

    Как я указывал неоднократно вы хам. Что подтвержает ваш ответ на это заявление - "Мне плевать как я выгляжу". Ну это так дело каждого лично.

    Я сижу один за монитором в данный момент и я не учусь в школе слава богу. Я ещё я слово ( подрочить ) в кавычки брал, думал вы поймёте.



    А теперь МОЯ позиция на взгляды МОЕЙ позиции:

    Хочу услышать творческий подход в виде размышлений, обсуждений, проблем работы из жизни, неудобств работы с ORM или СУБД.
     
  24. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    А мне плевать. Ты никто, чтобы с твоим мнением считаться.
    И ничем не показал, что являешься адекватным собеседником соответствующего уровня.
    Поэтому я не вижу повода беречь твое самолюбие.

    Не вижу смысла напрягаться и понимать. Причины те же что и выше.

    Хоти.
     
  25. r00les

    r00les Активный пользователь

    С нами с:
    4 сен 2009
    Сообщения:
    142
    Симпатии:
    0
    Simpliest

    Более того, я ничтожество.