[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: ActiveRecord
Страницы: 1, 2, 3, 4, 5, 6
chee
Цитата (twin @ 16.03.2018 - 23:22)
Да и вообще, это полезно было бы - алиасы.

Абстракции потекли неуспевши сформироваться.

Я такие проблемы решал так:

Если запрос без агрегации и выбор идет из одной таблица, то ипользуется такой билдер

$query = $queryFactory->get('Users', 'FindBy');
$query->setCriteria([
'contact_id' => [1,2,3],
'deleted' => $query->expr('NotNull'),
'date_entered' => $query->expr('LessOrEqual', '2015-12-22'),
]);

$query->fetchAll();


А если же начинается какой-то хардкор, то пишется на чистом скуле и обварачивается объектом

$query = $queryFactory->get('Users', 'UserForDeleteInactive');
$query->setPeriod('1 week');
$query->fetchAll();


Очень гибко, а главное, не течет sql через такую абстракцию. Минусом является, один запрос - один класс. Но плюсов намного больше.

_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
twin
Цитата (chee @ 16.03.2018 - 23:16)
Я работал с 3 разными AR, не в одной из них такой функционал не нужен был. Если нужны были какие-то поля у объекта, то выгружались все поля. AR это про упрощение жизни, а не оптимизацию. Ты акцентируешь внимание не на тех вещах и занимаешься каким-то микро-менеджементом. Когда у тебя в системе буду в реальном времени сотни объектов, последнее что ты захочешь это то что бы у них качество (в данном случае набор потенциально заполненных полей) различалось.
Тут речь идет не о конечном продукте, а об инструменте, с помощью которого этот продукт делается. Тебе не важна оптимизация, кому то может понадобится. Я же не заставляю писать именно так, я хочу предоставить возможность. Именно это и делают мейнстримные фреймворки.
Цитата (chee @ 16.03.2018 - 23:27)
Очень гибко, а главное, не течет sql через такую абстракцию. Минусом является, один запрос - один класс. Но плюсов намного больше.
В том и дело, чтобы предоставить выбор. Какие плюсы важнее, те и использовать. Я как то писал свою историю, я на работу устроился потому, что сбежал предыдущий программист. Который рассуждал так, как ты:
Цитата (chee @ 16.03.2018 - 23:27)
один запрос - один класс.
В результате на хайлоаде начали падать сервера. После моей оптимизации ресурсоемкость снизилась в 20(!) раз. Так что это тоже важно - иметь возможность писать оптимально.

Вопрос собственно был не в том, я наверное неверно сформулировал. Вопрос следующий:
Какие могут быть подводные камни, если немного отойти от чистого паттерна.

Вообще я понял уже, что ничего страшного в этом нет, и что эта возможность есть в мейнстримах. Так что спасибо за ответ. smile.gif


_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
Michael
Цитата (twin @ 16.03.2018 - 21:22)
User::select(['num' => $command->expression('MAX(id)')])

А значит в модели появится поле num, которого нет в таблице.  Соответственно модель получится только для чтения. Стоит с этим бороться програмно, или (как мне кажется) не стоит думать о дураках?  :)  Я имею ввиду защиту от дурака, уж больно громоздкой она получается.  :(

AR - это такой паттерн который танцует от таблицы. Он знает какие поля есть, какой у них тип, какие из них - pk и т.д.

Например в yii2 ты можешь себе выбрать что то дополнительно в модель, но для этого надо завести самому доп поле, если его нет то игнорируется. И с теми полями(сохраняемыми) из БД это поле не пересекается.



_____________
There never was a struggle in the soul of a good man that was not hard
twin
Цитата (Michael @ 17.03.2018 - 06:57)
какой у них тип,
А можно вот это поподробнее, откуда знает?
Цитата (Michael @ 17.03.2018 - 06:57)
Например в yii2 ты можешь себе выбрать что то дополнительно в модель, но для этого надо завести самому доп поле

Вот в том и вопрос, чтобы не заводить дополнительных полей. Как из запроса пришло, так и должно быть в объекте. Это примерно как fetchObject() в PDO. Только он не запишется в таком случае.

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

_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
Michael
делает запрос к базе, чтобы получить схему таблицы, типа show create table.


_____________
There never was a struggle in the soul of a good man that was not hard
twin
Каждый раз??? Или где то метаданные хранит? А зачем...

_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
chee
Цитата (twin @ 17.03.2018 - 05:44)
Вообще я понял уже, что ничего страшного в этом нет, и что эта возможность есть в мейнстримах.

Тогда почему ты не используешь популярные решения? Ведь по факту, ты сейчас расписываешься, что не закрываешь проблемы, которые есть в популярных решениях, а попросту делаешь как сделано у них. Зачем тогда писать своё решение?

Цитата (twin @ 17.03.2018 - 05:44)
В результате на хайлоаде начали падать сервера.

Давай ты мне скинешь исходники того продукта (который не держал нагрузку), я посмотрю, а потом уже сделаю вывод и правда ли там все падало из-за применения ООП. Я гарантирую, что дальше меня эти исходники не пойдут.

_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
twin
Цитата (chee @ 17.03.2018 - 10:37)
Ведь по факту, ты сейчас расписываешься, что не закрываешь проблемы, которые есть в популярных решениях, а попросту делаешь как сделано у них. Зачем тогда писать своё решение?

Так а это не проблема. Это наоборот хорошо. Я не нашел этого в доках, думал что нет такой возможности, захотел сделать. И спросил на всякий случай. Оказывается есть, ну и славненько. А свое решение для души. smile.gif Ну нравится мне, что поделать. Может и правда сделаю что то оригинальное в процессе.

Цитата (chee @ 17.03.2018 - 10:37)
Давай ты мне скинешь исходники того продукта
Да какие исходники, лет 8 прошло уже. smile.gif И не в ООП там было дело, а в реализации. В двух словах, нужно было вывести на странице около 50-ти анкет. Данные брались из разных таблиц. Вот он сделал анкету самостоятельной сущностью и получал их по одной. В итоге вышло около 300 запросов только по анкетам, плюс еще другие.

Я почему вспомнил, потому что ты сказал
Цитата (chee @ 16.03.2018 - 23:27)
Минусом является, один запрос - один класс
У него было не на класс, а на объект. Но не суть, я не вижу смысла как то изгляться снаружи, если можно сделать все автоматически.

_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
Michael
Цитата (twin @ 17.03.2018 - 11:54)
Каждый раз??? Или где то метаданные хранит? А зачем...

На продакшене конечно из кеша структуру берет.

Затем что когда структура таблицы будет меняться, чтобы класс AR модели не пришлось переделывать, а бралось на лету.
Не знаю, ты у себя , вручную что ли собрался заставить пользователя вводить и обновлять метаданные?


_____________
There never was a struggle in the soul of a good man that was not hard
twin
"А зачем..." я спросил не про метаданные, а про типы. Зачем скрипту знать типы данных? Я подозреваю, что для валидации запросов, что то попадалось в коде. Или еще для чего то?

_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
twin
Крик души)))

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

Если выгружать все, можно огрести оверхед по памяти. sad.gif И еще, в основе все так и есть, выборка части полей все же весьма опциональная весчь, на всякий пожарный.

_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
Michael
Цитата (twin @ 17.03.2018 - 16:53)
"А зачем..." я спросил не про метаданные, а про типы. Зачем скрипту знать типы данных? Я подозреваю, что для валидации запросов, что то попадалось в коде. Или еще для чего то?

Нет, не валидация. Валидация не относится к AR.
Тебе надо мапить int в базе в int в php, float в float, строку в строку, json в json, SQL NULL в php null и обратно и т.д. Для этого надо знать тип столбца/переменной.

_____________
There never was a struggle in the soul of a good man that was not hard
twin
Офигеть... А для чего это в языке с динамической типизацией? Где это используется? Я вот 8 лет прорабтал, с такой необходимостью ни разу не сталкивался. sad.gif

_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
Arh
twin
Я сталкивался несколько раз что в базе int, а приходит строка.
В php 5.6 это как то решалось, а в php 7 не получилось. В итоге теперь всегда привожу к нужным типам.

_____________
Промокод предоставляет скидку на заказ домена и/или хостинга reg.ru
BFCC-3895-8804-9ED2
twin
Это не аргумент. Я сейчас специльно проверял со всех сторон, в версии 7.1
PDO::ATTR_EMULATE_PREPARES = false;
PDO::ATTR_STRINGIFY_FETCHES = false;
работают на ура. Распознает и в ту и другую сторону.

Быть может у тебя какая то кривая сборка, но ради этого не стоит городить такую систему. Максимум опцией и вручную. Как, кстати, и сделано в Laravel.

Может еще есть причины?

_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.