Флаги публикации при выборке

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Nex-Otaku
Сообщения: 831
Зарегистрирован: 2016.07.09, 21:07

Флаги публикации при выборке

Сообщение Nex-Otaku »

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

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

Article::find()->where(['deleted' => false, 'enabled' => true]);
При этом, если мы отображаем страницу этой записи, мы также должны проверить и публикацию всех связанных с ней записей.
Если связанные записи не опубликованы, то и сама запись должна быть недоступна.
Пример:

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

Article::find()
        ->joinWith('category')
        ->joinWith('author')
        ->andWhere([Article::tableName() . '.deleted' => false])
        ->andWhere([Article::tableName() . '.enabled' => true])
        ->andWhere([Categories::tableName() . '.deleted' => false])
        ->andWhere([Categories::tableName() . '.enabled' => true])
        ->andWhere([Author::tableName() . '.deleted' => false])
        ->andWhere([Author::tableName() . '.enabled' => true]);
Выглядит некрасиво, и легко можно что-то забыть, напутать.

Как сделать лучше?
Nex-Otaku
Сообщения: 831
Зарегистрирован: 2016.07.09, 21:07

Re: Флаги публикации при выборке

Сообщение Nex-Otaku »

ElisDN писал(а): 2017.04.23, 08:15 Article::find()->published()
Это я знаю, но получается, мы просто убираем этот же код в другое место. Потому что в "published" будут всё те же многоэтажные условия. Я умею избавляться от дублирования кода, проблема не в этом.

Хочу как-то решить, может быть через архитектуру, чтобы проверки флагов подразумевались под каждую модель, для которой они определены.

Например, когда я делал сервер на Java, реализовывал SoftDelete, там внедрил эти проверки на уровне скажем так обращения к БД. Не могу точнее сказать, много лет там уже не работаю, исходников не сохранил. Два режима, по умолчанию "чтение только неудалённых". Читаются и подсчитываются только неудалённые записи. Второй режим - с отключенными проверками, когда читаются все записи, для сбора статистики.

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

Чего-то такого, пусть не идеально, но хотя бы близко, хочется и в Yii. Это возможно? Или гиблая затея?
caHek2x
Сообщения: 1240
Зарегистрирован: 2016.04.12, 20:41

Re: Флаги публикации при выборке

Сообщение caHek2x »

я для таких задач переопределяю просто метод find и делаю так:

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

    public static function find($only_active = true)
    {
        $query = new UsersQuery(get_called_class());
        if ($only_active) $query->active();
        return $query;
    }
и тогда и к связям автоматически это применяется ...
Nex-Otaku
Сообщения: 831
Зарегистрирован: 2016.07.09, 21:07

Re: Флаги публикации при выборке

Сообщение Nex-Otaku »

Неплохой вариант, спасибо ) Надо будет обдумать.
Смущает только класс UsersQuery, не хотелось бы для каждой модели ещё и Query-класс заводить.
caHek2x
Сообщения: 1240
Зарегистрирован: 2016.04.12, 20:41

Re: Флаги публикации при выборке

Сообщение caHek2x »

я для каждой модели завожу класс ... правда пишу его не как gii в отдельный файл ... а в файл с моделью, написал просто свой шаблон для gii ...
а так можете сделать один общий ... и его возвращать ... проблемы нет ...
Ответить