Как сделать query запрос используя репозиторий?

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
myks1992@mail.ru
Сообщения: 147
Зарегистрирован: 2017.11.15, 23:54

Как сделать query запрос используя репозиторий?

Сообщение myks1992@mail.ru »

Всем привет. Вопрос простой, но не пойму как лучше сделать. Пытаюсь вынести всю работу с базой данных в Repository. Всё вынести благополучно получилось, осталось только Search модель. С ней я что-то затупил. Там получается, что ActiveDataProvider принимает не данные, а $query, а уже вконце сам подготавливает данные делает запрос и вызавает all() из AR.

Код: Выделить всё

/**
     * {@inheritdoc}
     */
    protected function prepareModels()
    {
        if (!$this->query instanceof QueryInterface) {
            throw new InvalidConfigException('The "query" property must be an instance of a class that implements the QueryInterface e.g. yii\db\Query or its subclasses.');
        }
        $query = clone $this->query;
        if (($pagination = $this->getPagination()) !== false) {
            $pagination->totalCount = $this->getTotalCount();
            if ($pagination->totalCount === 0) {
                return [];
            }
            $query->limit($pagination->getLimit())->offset($pagination->getOffset());
        }
        if (($sort = $this->getSort()) !== false) {
            $query->addOrderBy($sort->getOrders());
        }

        return $query->all($this->db);
    }
Кроме того в AR можно было вынести в Active Query. И получается ещё интереснее

Код: Выделить всё

Model::find()->active()
. Но в репозории я сразу вызываю метод

Код: Выделить всё

Repository->findActive()
;

Как мне в таком случае выстраивать адаптивный Repository? Тупо повторять все методы AQ? Или есть другие способы? Так же инетерсует про жадную загрузку...

Код: Выделить всё

width('user')
...

Помогите, пожалуйста......
Аватара пользователя
SiZE
Сообщения: 2817
Зарегистрирован: 2011.09.21, 12:39
Откуда: Perm
Контактная информация:

Re: Как сделать query запрос используя репозиторий?

Сообщение SiZE »

class RepositoryDataProvider extends BaseDataProvider
myks1992@mail.ru
Сообщения: 147
Зарегистрирован: 2017.11.15, 23:54

Re: Как сделать query запрос используя репозиторий?

Сообщение myks1992@mail.ru »

Это понял. А с остальными методами как поступить? Особенно когда нужно собрать запрос как в Yii Например

Код: Выделить всё

Model::find()->active->fromDate($date)->all()
Или:

Код: Выделить всё

Model::find()->width('user')->limin($limit)->all()
Как это всё заменять используя свой репозиторий?
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Как сделать query запрос используя репозиторий?

Сообщение ElisDN »

Код: Выделить всё

class ModelFetcher
{
    function allActiveFrom(DateTimeImmutable $date): array {}
    function latestWithUser(int $limit): array {}
}
myks1992@mail.ru
Сообщения: 147
Зарегистрирован: 2017.11.15, 23:54

Re: Как сделать query запрос используя репозиторий?

Сообщение myks1992@mail.ru »

ElisDN писал(а): 2019.05.02, 21:46

Код: Выделить всё

class ModelFetcher
{
    function allActiveFrom(DateTimeImmutable $date): array {}
    function latestWithUser(int $limit): array {}
}
Благодарю за ответ! Немного наверное не поняли вопрос. Делаю по вашему обучению из недели ООП. Все запросы выносятся в репозиторий. Я думал, что работу с базой и надо делать в репозитории, а не модели. Судя по вашему примеру это запросы модели. Я же хочу из модели запросы все вынести в репозиторий.

Из-за этого у меня пока в голове не укладывается как изменено это лучше сделать. Ведь в YII есть жадная загрузка с методом with(‘user’). Есть лимиты limit(). Так же можно свои запросы сделать используя AQ, например active(). В итоге мы собираем запрос на лету пристыковывая эти все методы и вызываем ->all() или ->count(). В Yii я понимаю как это работает и как это делать, но пока не могу понять как можно сделать это используюя репозиторий. Если не сложно, то расскажите) или просто скиньте ссылку на пример с открытым кодом. Я разберусь.

И вот второй вопрос это как раз связан с провайдером данных. Там используется query и он сам уже вызывает методы all() и count(). Но в репозитории, я так понимаю, query запрос не сделать.

Что-то у меня не складывается в голове это. Как бы не налапшекодить.... А у вас в уроке не показано как вы работаете с Search моделью и использовании в ней фильтрации данных и запросов(
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Как сделать query запрос используя репозиторий?

Сообщение ElisDN »

Если делать реальный репозиторий, то нужно выбросить ActiveRecord и работать с базой самому как в:
https://elisdn.ru/blog/104/domain-entities-modelling
https://elisdn.ru/blog/106/domain-native-repository
Но это редко кому нужно, так как для этого хватает Doctrine.

Если же делать его имитацию в Yii с AR, то можно вернуть и сам провайдер:
https://github.com/ElisDN/yii2-demo-sho ... roller.php
https://github.com/ElisDN/yii2-demo-sho ... sitory.php
Последний раз редактировалось ElisDN 2019.05.03, 02:58, всего редактировалось 1 раз.
myks1992@mail.ru
Сообщения: 147
Зарегистрирован: 2017.11.15, 23:54

Re: Как сделать query запрос используя репозиторий?

Сообщение myks1992@mail.ru »

ElisDN писал(а): 2019.05.03, 00:34 Если делать реальный репозиторий, то нужно выбросить ActiveRecord и работать с базой самому как в:
https://elisdn.ru/blog/104/domain-entities-modelling
https://elisdn.ru/blog/106/domain-native-repository

Если же делать его имитацию в Yii с AR, то можно вернуть и сам провайдер:
https://github.com/ElisDN/yii2-demo-sho ... roller.php
https://github.com/ElisDN/yii2-demo-sho ... sitory.php
Благодарю! То что нужно, как всегда!)) Выкинуть AR полностью пока не могу, но стремлюсь к simfony. Надеюсь доберуюсь в скором времени с вашими то хорошими практиками)
Ответить