繁体   English   中英

Yii2模型ViaTable

[英]Yii2 Model ViaTable

为了简单起见,假设我有3个表: menupage和一个联结表menu_page

因此,如果我想获取“主页”页面可用的所有菜单,则在模型中我定义了一个关系:

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

但是现在我们在菜单表中添加了一个名为show_all_pages的属性,如果将此属性设置为1,则应该返回菜单,如果没有,我们应该检查菜单是否启用了可在家庭使用。

有没有办法在这里添加此条件?

您可以使用的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]);
}

到目前为止,我发现的解决方案是分离活动查询并进行联合:

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);

    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM