Страница 1 из 2
Какой паттерн лучше использовать?
Добавлено: 2019.12.31, 22:44
user
В yii можно реализовать сервисы и гибко управлять данными.
http://localhost/users?fields=id,email&expand=profile
Но, если используется Model или AR
У меня данные выбираются прямым запросом с помощью createCommand, AR не применим, т.е. выбирается массив данных, как можно преобразовать массив в объект класса Model, что-то типа DTO-шки, чтобы можно было также гибко управлять запросами?
Re: Какой паттерн лучще использовать?
Добавлено: 2020.01.01, 00:21
ElisDN
Переместить этот запрос в CREATE VIEW в БД и сделать AR, в tableName() которой указать этот view.
Re: Какой паттерн лучще использовать?
Добавлено: 2020.01.01, 00:30
user
Re: Какой паттерн лучще использовать?
Добавлено: 2020.01.01, 10:47
ElisDN
Да.
Re: Какой паттерн лучще использовать?
Добавлено: 2020.01.01, 13:15
yiiliveext
Но не факт, что эти объекты не будут только для чтения. Если требуется и чтение, и изменение, то лучше использовать Data Mapper.
Re: Какой паттерн лучще использовать?
Добавлено: 2020.01.01, 17:26
user
есть еще же Репозиторий
Re: Какой паттерн лучще использовать?
Добавлено: 2020.01.01, 18:13
yiiliveext
user писал(а): ↑2020.01.01, 17:26
есть еще же Репозиторий
И на чем же он построен, если вам требуются напрямую использовать классы фреймворка для формирования выборки данных?
Re: Какой паттерн лучще использовать?
Добавлено: 2020.01.01, 18:22
user
yiiliveext писал(а): ↑2020.01.01, 18:13
user писал(а): ↑2020.01.01, 17:26
есть еще же Репозиторий
И на чем же он построен, если вам требуются напрямую использовать классы фреймворка для формирования выборки данных?
и где в yii используется Data Mapper?
Re: Какой паттерн лучще использовать?
Добавлено: 2020.01.01, 19:37
yiiliveext
user писал(а): ↑2020.01.01, 18:22
и где в yii используется Data Mapper?
Нигде, это паттерн, вы можете использовать его при написании собственной реализации репозитория, где сущности будут проецироваться на источник данных.
Re: Какой паттерн лучще использовать?
Добавлено: 2020.01.01, 20:02
user
Понял, просто в yii ORM реализована, это будет мой первый паттерн
а DTO не подойдет?
Re: Какой паттерн лучще использовать?
Добавлено: 2020.01.01, 20:22
yiiliveext
user писал(а): ↑2020.01.01, 20:02
Понял, просто в yii ORM реализована, это будет мой первый паттерн
а DTO не подойдет?
DTO - это то, что может возвращать репозиторий, простейший объект для передачи данных между слоями. Иногда делают так, что репозиторий возвращает готовую сущность, вместо DTO, а иногда гидратор выносят в отдельный сервис и тогда репозиторий возвращает DTO.
Re: Какой паттерн лучще использовать?
Добавлено: 2020.01.01, 20:25
user
спасибо, попробую теперь во всем этом разобраться
Re: Какой паттерн лучще использовать?
Добавлено: 2020.01.02, 09:22
user
yiiliveext писал(а): ↑2020.01.01, 13:15
Но не факт, что эти объекты не будут только для чтения. Если требуется и чтение, и изменение, то лучше использовать Data Mapper.
вот нашел описание этого паттерна
https://designpatternsphp.readthedocs.i ... EADME.html
все работает, а если мне нужно забрать все данные, немного не понимаю.
Re: Какой паттерн лучще использовать?
Добавлено: 2020.01.02, 10:11
yiiliveext
user писал(а): ↑2020.01.02, 09:22
yiiliveext писал(а): ↑2020.01.01, 13:15
Но не факт, что эти объекты не будут только для чтения. Если требуется и чтение, и изменение, то лучше использовать Data Mapper.
вот нашел описание этого паттерна
https://designpatternsphp.readthedocs.i ... EADME.html
все работает, а если мне нужно забрать все данные, немного не понимаю.
Реализуйте метод findAll(), который будет возвращать коллекцию сущностей/DTO.
Re: Какой паттерн лучще использовать?
Добавлено: 2020.01.03, 01:59
user
что-то у меня не особо получилось
реализовал на коленке репозитогрий и он мне возвращает тот же массив, что и на входе, а управлять полями я не могу
Re: Какой паттерн лучше использовать?
Добавлено: 2020.01.03, 07:05
anton_z
Ну ппц, наговорили человеку. После такого, только и остается, что паттерны изучать))). Может это лучше подойдет?
https://www.yiiframework.com/doc/api/1. ... rds-detail Как раз для создания AR по данным из ассоциативных массивов.
Re: Какой паттерн лучше использовать?
Добавлено: 2020.01.03, 07:30
user
а причем 1.1? хотя в yii2 есть тоже ) попробую разобраться
хотя в документации есть упоминание
При работе с базой данных через DAO все данные представляются в виде строк, что не всегда корректно. Особенно учитывая, что в JSON для чисел есть соответствующий тип. При использовании ActiveRecord значения числовых столбцов приводятся к integer на этапе выборки из базы: yii\db\ActiveRecord::populateRecord().
я год назад спрашивал про это тут, никто не ответил
нашел решение, но для выборки одной записи.
https://coderius.biz.ua/blog/article/yi ... ql-zaprosa
но опять проблема, а если несколько записей?
то, что должна быть таблица в БД с данной моделью, понятно, хотя данные приходят из внешнего источника.
Re: Какой паттерн лучще использовать?
Добавлено: 2020.01.03, 09:28
yiiliveext
user писал(а): ↑2020.01.03, 01:59
что-то у меня не особо получилось
реализовал на коленке репозитогрий и он мне возвращает тот же массив, что и на входе, а управлять полями я не могу
Для целей инициализации сущностей из данных выборки вам нужен гидратор.
я год назад спрашивал про это тут, никто не ответил
нашел решение, но для выборки одной записи.
https://coderius.biz.ua/blog/article/yi ... ql-zaprosa
но опять проблема, а если несколько записей?
Customer::findBySql('SELECT * FROM customer')->all();
Пы.Сы. Может вам все же лучше использовать AR? Приведите лучше пример запроса, который вы не можете совместить с AR или QB.
Re: Какой паттерн лучще использовать?
Добавлено: 2020.01.04, 13:12
anton_z
yiiliveext писал(а): ↑2020.01.03, 09:28
Для целей инициализации сущностей из данных выборки вам нужен гидратор.
Человек вроде про Yii спрашивает, мне бы это никак не помогло, только бы в сторону увело от решения. Про репозитории и DataMapper тоже самое. Из темы я понял что TS ищет решение на yii, с паттернами незнаком.
Для Yii2 я бы сделал статический метод для инкапсуляции создания объекта из ассоциативных массивов:
Код: Выделить всё
$record = ActiveRecordSubclass::instantiateWith($row);
class ActiveRecordSubclass extends ActiveRecord
{
//для одного
public static function instantiateWith(array $row): ActiveRecordSubclass
{
$records = self::find()->populate([$row]);
return reset($records) ?: null;
}
//для нескольких
public static function instantiateAllWith(array $rows): ActiveRecordSubclass
{
return self::find()->populate($rows);
}
}
Для приведения типов в AR можно использовать это:
https://www.yiiframework.com/doc/api/2. ... stbehavior.
Представленный выше метод будет работать с этим поведением корректно.
Второй путь это разобраться, почему не получается с ActiveQuery запрос сделать, но мало ли откуда TS данные берет.
Re: Какой паттерн лучще использовать?
Добавлено: 2020.01.04, 21:56
user
anton_z писал(а): ↑2020.01.04, 13:12
Второй путь это разобраться, почему не получается с ActiveQuery запрос сделать, но мало ли откуда TS данные берет.
спасибо большое, я бы шаблоны изучил, но это параллельно, сейчас надо работаться с текущей задачей.
а не получатся потому что идет запрос с бд, он очень сложный и ar он просто не вытянет, сфера применения ar ограничена, если интересно я в личку кину один из таких заппросов