Какой паттерн лучше использовать?

Обсуждаем, как правильно строить приложения
user
Сообщения: 159
Зарегистрирован: 2017.12.05, 16:55

Какой паттерн лучше использовать?

Сообщение user »

В yii можно реализовать сервисы и гибко управлять данными.
http://localhost/users?fields=id,email&expand=profile
Но, если используется Model или AR
У меня данные выбираются прямым запросом с помощью createCommand, AR не применим, т.е. выбирается массив данных, как можно преобразовать массив в объект класса Model, что-то типа DTO-шки, чтобы можно было также гибко управлять запросами?
Последний раз редактировалось user 2020.01.03, 02:58, всего редактировалось 1 раз.
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Какой паттерн лучще использовать?

Сообщение ElisDN »

Переместить этот запрос в CREATE VIEW в БД и сделать AR, в tableName() которой указать этот view.
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: Какой паттерн лучще использовать?

Сообщение yiiliveext »

Но не факт, что эти объекты не будут только для чтения. Если требуется и чтение, и изменение, то лучше использовать Data Mapper.
user
Сообщения: 159
Зарегистрирован: 2017.12.05, 16:55

Re: Какой паттерн лучще использовать?

Сообщение user »

есть еще же Репозиторий
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: Какой паттерн лучще использовать?

Сообщение yiiliveext »

user писал(а): 2020.01.01, 17:26 есть еще же Репозиторий
И на чем же он построен, если вам требуются напрямую использовать классы фреймворка для формирования выборки данных?
user
Сообщения: 159
Зарегистрирован: 2017.12.05, 16:55

Re: Какой паттерн лучще использовать?

Сообщение user »

yiiliveext писал(а): 2020.01.01, 18:13
user писал(а): 2020.01.01, 17:26 есть еще же Репозиторий
И на чем же он построен, если вам требуются напрямую использовать классы фреймворка для формирования выборки данных?
и где в yii используется Data Mapper?
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: Какой паттерн лучще использовать?

Сообщение yiiliveext »

user писал(а): 2020.01.01, 18:22 и где в yii используется Data Mapper?
Нигде, это паттерн, вы можете использовать его при написании собственной реализации репозитория, где сущности будут проецироваться на источник данных.
user
Сообщения: 159
Зарегистрирован: 2017.12.05, 16:55

Re: Какой паттерн лучще использовать?

Сообщение user »

Понял, просто в yii ORM реализована, это будет мой первый паттерн :)
а DTO не подойдет?
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: Какой паттерн лучще использовать?

Сообщение yiiliveext »

user писал(а): 2020.01.01, 20:02 Понял, просто в yii ORM реализована, это будет мой первый паттерн :)
а DTO не подойдет?
DTO - это то, что может возвращать репозиторий, простейший объект для передачи данных между слоями. Иногда делают так, что репозиторий возвращает готовую сущность, вместо DTO, а иногда гидратор выносят в отдельный сервис и тогда репозиторий возвращает DTO.
user
Сообщения: 159
Зарегистрирован: 2017.12.05, 16:55

Re: Какой паттерн лучще использовать?

Сообщение user »

спасибо, попробую теперь во всем этом разобраться :)
user
Сообщения: 159
Зарегистрирован: 2017.12.05, 16:55

Re: Какой паттерн лучще использовать?

Сообщение user »

yiiliveext писал(а): 2020.01.01, 13:15 Но не факт, что эти объекты не будут только для чтения. Если требуется и чтение, и изменение, то лучше использовать Data Mapper.
вот нашел описание этого паттерна https://designpatternsphp.readthedocs.i ... EADME.html
все работает, а если мне нужно забрать все данные, немного не понимаю.
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: Какой паттерн лучще использовать?

Сообщение yiiliveext »

user писал(а): 2020.01.02, 09:22
yiiliveext писал(а): 2020.01.01, 13:15 Но не факт, что эти объекты не будут только для чтения. Если требуется и чтение, и изменение, то лучше использовать Data Mapper.
вот нашел описание этого паттерна https://designpatternsphp.readthedocs.i ... EADME.html
все работает, а если мне нужно забрать все данные, немного не понимаю.
Реализуйте метод findAll(), который будет возвращать коллекцию сущностей/DTO.
user
Сообщения: 159
Зарегистрирован: 2017.12.05, 16:55

Re: Какой паттерн лучще использовать?

Сообщение user »

что-то у меня не особо получилось
реализовал на коленке репозитогрий и он мне возвращает тот же массив, что и на входе, а управлять полями я не могу
anton_z
Сообщения: 483
Зарегистрирован: 2017.01.15, 15:01

Re: Какой паттерн лучше использовать?

Сообщение anton_z »

Ну ппц, наговорили человеку. После такого, только и остается, что паттерны изучать))). Может это лучше подойдет? https://www.yiiframework.com/doc/api/1. ... rds-detail Как раз для создания AR по данным из ассоциативных массивов.
user
Сообщения: 159
Зарегистрирован: 2017.12.05, 16:55

Re: Какой паттерн лучше использовать?

Сообщение user »

anton_z писал(а): 2020.01.03, 07:05 Ну ппц, наговорили человеку. После такого, только и остается, что паттерны изучать))). Может это лучше подойдет? https://www.yiiframework.com/doc/api/1. ... rds-detail Как раз для создания AR по данным из ассоциативных массивов.
а причем 1.1? хотя в yii2 есть тоже ) попробую разобраться
хотя в документации есть упоминание
При работе с базой данных через DAO все данные представляются в виде строк, что не всегда корректно. Особенно учитывая, что в JSON для чисел есть соответствующий тип. При использовании ActiveRecord значения числовых столбцов приводятся к integer на этапе выборки из базы: yii\db\ActiveRecord::populateRecord().
я год назад спрашивал про это тут, никто не ответил

нашел решение, но для выборки одной записи.
https://coderius.biz.ua/blog/article/yi ... ql-zaprosa
но опять проблема, а если несколько записей?

то, что должна быть таблица в БД с данной моделью, понятно, хотя данные приходят из внешнего источника.
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: Какой паттерн лучще использовать?

Сообщение 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.
anton_z
Сообщения: 483
Зарегистрирован: 2017.01.15, 15:01

Re: Какой паттерн лучще использовать?

Сообщение 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 данные берет.
user
Сообщения: 159
Зарегистрирован: 2017.12.05, 16:55

Re: Какой паттерн лучще использовать?

Сообщение user »

anton_z писал(а): 2020.01.04, 13:12 Второй путь это разобраться, почему не получается с ActiveQuery запрос сделать, но мало ли откуда TS данные берет.
спасибо большое, я бы шаблоны изучил, но это параллельно, сейчас надо работаться с текущей задачей.
а не получатся потому что идет запрос с бд, он очень сложный и ar он просто не вытянет, сфера применения ar ограничена, если интересно я в личку кину один из таких заппросов
Ответить