Yii2 Модель ViaTable - PullRequest
       6

Yii2 Модель ViaTable

0 голосов
/ 25 июня 2018

Для простоты, скажем, у меня есть 3 таблицы: menu, page и таблица соединений menu_page.

Итак, если я хочу получить все меню, доступные для страницы "home", в модели я определил отношение:

public function getAllMenus() {
    return $this->hasMany(Menu::className(), ['id' => 'menu_id'])->viaTable(PageMenu::tableName(), ['page_id' => 'id']);
}

Но теперь мы добавили в таблицу меню атрибут с именем show_all_pages, если он установлен в 1, меню должно быть возвращено, если нет, мы должны проверить, разрешено ли использование меню в домашних условиях.

Есть ли способ добавить это условие здесь?

Ответы [ 2 ]

0 голосов
/ 20 июля 2018

Решение, которое я нашел до сих пор, заключалось в разделении активных запросов и объединении:

public function getSelectedMenus() {

        return $this->hasMany(Menu::className(), ['id' => 'menu_id'])->viaTable(PageMenu::tableName(), ['page_id' => 'id'])->onCondition(['menu.active' => Page::ACTIVE]);
    }

    public function getAllMenus() {
        return Menu::find()->where(['active' => Page::ACTIVE, 'show_all_pages' => 1]);
    }

    public function getMenus() {

        $selectedMenus = $this->getSelectedMenus();
        $allMenus = $this->getAllMenus();

        return $selectedMenus->union($allMenus);

    }
0 голосов
/ 25 июня 2018

Вы можете использовать предложение andWhere, чтобы применить этот фильтр к show_all_pages

public function getAllMenus() {
    return $this->hasMany(Menu::className(), ['id' => 'menu_id'])
                ->viaTable(PageMenu::tableName(), ['page_id' => 'id'])
                ->andWhere(['show_all_pages' => 1]);
}
...