Есть ли ОРМ которые могут связывать три, две таблицы в виде модулей, например: Если три таблицы: книги читатели журнал ------------ модуль Библиотека. И что бы в дальнейшем я работал с ним ( модулем ) так: megaORM::get ( 'library' ) -> books ( $id ). --------------------------------------------------- id: 1 Антон Фиглиф - преступление и преступление Читает Крупкин Вадим, Пранкин Саша Журнал: брали тогда то и тогда то
она умеет, впрочем, если мне не изменяет память это умеет и Propel, и Hibernate и многие другие. Это в какой-то степени умеет даже моя корявая модель PHP: <?php public function selectWithPreDefinedSelect(Zend_Db_Select $select = null, $withFromPart=self::SELECT_WITHOUT_FROM_PART) { if (!$select) { $select = $this->select(true); } $select->setIntegrityCheck(false); $refList = $this->getFullInfoReferenceList(); $depth = $this->getFullInfoDepth(); if ($this->isFullInfo() && $refList && $depth) { $depth--; foreach ($refList as $refName) { $refInfo = $this->getReferenceByRuleKey($refName); $fieldName = $refInfo['columns']; $mapper = $this->getReferenceMapperByRefName($refName); $select->join( $mapper->info('name'), $this->getAdapter()->quoteIdentifier($this->info('name')) . '.' . $this->getAdapter()->quoteIdentifier($fieldName) . ' = ' . $this->getAdapter()->quoteIdentifier($mapper->info('name')) . '.' . $this->getAdapter()->quoteIdentifier($refInfo['refColumns'])); $select = $mapper->setFullInfoDepth($depth)->enableFullInfo()->selectWithPreDefinedSelect($select)->setIntegrityCheck(false); } } return $select; } PHP: <?php $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()); 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]
Simpliest Так, я так понял это вы под конкретный случай пример привели, а насколько гибкой она окажется ? возможно ли создавать подобные модули на "лету" ?. Напрмиер: $this->library = ORM::tables ( "users", "books" ) -> bind ( "idusers", "idbooks" ); $this->library->books->login ( 'r00les' ); >> r00les | Данте ( Божественная комедия )
PHP: <?php protected $_referenceMap = array( 'weight_measure' => array( 'columns' => 'weight_measure', 'refTableClass' => 'Model_Mapper_WeightMeasure', 'refColumns' => 'weight_measure_id' ), 'volume_measure' => array( 'columns' => 'volume_measure', 'refTableClass' => 'Model_Mapper_VolumeMeasure', 'refColumns' => 'volume_measure_id' ), 'auto_type_id' => array( 'columns' => 'auto_type_id', 'refTableClass' => 'Model_Mapper_AutomobileType', 'refColumns' => 'auto_type_id' ), 'location_id' => array( 'columns' => 'location_id', 'refTableClass' => 'Model_Mapper_Location', 'refColumns' => 'location_id' ) ); Напишешь сеттер для этой ерунды и будет у тебя "на лету". Впрочем стандартный Zend_Db_Table обладает этой же функцией из коробки, только несколько другими средствами. Только как для меня "на лету" оказалось слишком многословным.
Simpliest А мо ж ещё ОС написать ? Я говорил о том что бы не блыо от программиста лишнего кода типа сетера, гетера, хуетера ( простите )
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()); ----------------------------------------------------------------------------------------------------- Ваш пример выше выглядел как минимум не красиво и не читабельно, как минимум. Если да же сравнивать с тем что приводил и хотел увидеть я. Если вы считаете что они равны, то пусть для вас так и будет.
r00les, убейся. Мне плевать как я выгляжу, мне важен факт, что собеседник идиот не понимающий о чем речь, а значит с ним нельзя ничего обсуждать. Если человек тупо не знает что такое сеттер и это для него является чем-то заоблачным и сопоставимым с написанием ОС, то о чем может идти речь? О каких ОРМ? Не смешите мои тапочки. Для альтернативно-одаренных, популярно объясняю. Вот это внутренняя реализация связывания в моделях: А вот это, как оно используется в коде: PHP: <?php $model = new Model_Mapper_Location(); $model->enableFullInfo()->setFullInfoDepth(4)->fetchAll()->toArray() Извлечение графа по всем ветвям на глубину 4 PHP: <?php $model->enableFullInfo()->setFullInfoReferenceList(array('user_id', 'offer_id'))->fetchAll()->toArray() Извлечение графа по ветвям user_id, offer_id на глубину 1 При этом меня абсолютно не интересуют особенности реализации хранения отдельных моделей в БД и как они себя получают из 1й или 10ти таблиц. Я получаю граф объектов, который одним движением сериализуется в XML, массив или еще в что-то, буде мне того пожелается. При этом весь код для работы с этим генерируется автоматически по описанию структуры. Но чтобы это понимать, надо хотя бы вдуматься в то что показали, куда как проще работать языком и корчить из себя обиженную невинность.
Simpliest Я с вами согласен и замечу, что тему открыл я. Поверте я изучил те или иные материалы прежде чем это сделать. Вы мне отвратительны, ваши доводы не убедительны, а объяснения никчёмные. Ещё раз повторюсь, я тут обсуждаю ОРМ которая не предполагает ничего писать, а вся работа осуществляется через её классы и объекты. Я не могу ничего сделать если вы меня не понимаете. Просто это тема не для вас. Ещё раз показывает высоту вашего интеллекта. -------------------------------------------------------------------------------------------------------------------------- По делу, я привёл пример в одну строчку того, чего я хочу увидеть от функционала ORM -------------------------------------------------------------------------------------------------------------------------- PHP: $this->library = ORM::tables ( "users", "books" ) -> bind ( "idusers", "idbooks" ); $this->library->books->login ( 'r00les' ); А теперь вопрос, код который вверху ( мой ), читабельные и понятнее вашего ?
Simpliest И ещё, меня не интересуют предварительные конфиги связываний и правил которыми вы тут кидаетесь. Я вообще в коде бы не хотел видеть конфиги иначе проще писать SQL-запрос так как он прозрачнее потому, что случаи бывают и очень часто такие, что: 1) Я неделю не кодил модуль и мне нужно лезть в конфиги что бы смотреть что с чем я там связывал. 2) Код мне передал другой программист, что в двойне сложнее
Это форум, где люди общаются посредством передачи текстовой информации. Мистер умник. Я то же могу по умничать.
А не меряйтесь высотой Тогда не будет мучительно больно за свою низость Йо диджей, продолжаем писать глупости? Это мифический код, которого банально даже нет еще А это реальный рабочий код. PHP: <?php $library = $model->enableFullInfo()->setFullInfoReferenceList(array('users_id', 'books_id'))->fetchAll(); А вот он же, после переименования методов(хотя их названия отдельная песня) и небольшого рефакторинга (найдите 10ть отличий от своих "хотелок") PHP: <?php $library = new Model_Mapper_Library(); $library->bind(array('users_id', 'books_id')); $library->books->login('дурашка r00les'); //а можно и так $library->bind(array('users_id', 'books_id'))->books->login('дурашка r00les'); //а можно даже так, только за такое я бы руки поотрывал. $library->addReference('школьники', 'login', 'Model_Школьники_Mapper', 'школьники_ид', $onDelete, $onUpdate)->bind('школьники')->school('интернат одаренных') И да, 99% этого функционала из коробки, я лишь допилил методы под свой стиль. Еще вопросы чудо?
Не хочешь не видь. У меня они автоматически генерируются по структуре БД, с тем чтобы при работе на запрашивать метаинформацию в БД каждый раз. И наружу видны только на чтение, почему я и предлагал желающим писать свои сеттеры. Опа А в этих случаях вы телепатически поймете что у books есть какой-то метод login() который еще чего-то там и ищет? В моем случае все модели имеют полный автокомплит в IDE ибо магические методы не перегружаются функционалом (есть конечно тяжелое наследие отцов основателей в виде Zend_Db_Table, но все новые методы полностью показываются) А у вас? Подсказка после каждой стрелочки будет? Что-то мне говорит - нет.... Опа - два Так чей код понятнее?
Simpliest Нет, вот так: $this->library = ORM::tables ( "users", "books" ) -> bind ( "idusers", "idbooks" ); где: объект библиотека знает о таблицах "users" и "books" а так же знает, что связывать их нужно по двум полям "idusers" и "idbooks". Отношения полей к таблицам определяется позицией разделённой запятой. Опа и никаких автохуегенераторов.
Объект-то может и знает... Но для написания вот этого об этом должен знать программист. Поскольку автокомплита у тебя 0 целых. Дураки, не дураки - но не знаете ибо: Так что глупые школьники - 100% Ибо И держи себе это в памяти до позеленения. А к моменту готовности оно вырастет еще на 15ть таблиц.
Simpliest Скажите, вас интересуют творческие подходы к решению задач ? или вы любитель "подрочить" на википедию ?
Simpliest Код (Text): $library = new Model_Mapper_Library(); $library->bind(array('users_id', 'books_id')); $library->books->login('великолепный Simpliest');
Покажите мне их Я пока вижу сплошную распальцовку без базы знаний и опыта. Хочешь гнуть пальцы - изволь соответствовать по всем качествам. Меня больше интересуют девушки А это занятие я оставляю вам - школьникам
Simpliest Как я указывал неоднократно вы хам. Что подтвержает ваш ответ на это заявление - "Мне плевать как я выгляжу". Ну это так дело каждого лично. Я сижу один за монитором в данный момент и я не учусь в школе слава богу. Я ещё я слово ( подрочить ) в кавычки брал, думал вы поймёте. А теперь МОЯ позиция на взгляды МОЕЙ позиции: Хочу услышать творческий подход в виде размышлений, обсуждений, проблем работы из жизни, неудобств работы с ORM или СУБД.
А мне плевать. Ты никто, чтобы с твоим мнением считаться. И ничем не показал, что являешься адекватным собеседником соответствующего уровня. Поэтому я не вижу повода беречь твое самолюбие. Не вижу смысла напрягаться и понимать. Причины те же что и выше. Хоти.