Php Yii2型高架桥

Php Yii2型高架桥,php,yii2,yii2-model,Php,Yii2,Yii2 Model,为了简单起见,假设我有3个表:菜单,页面和一个连接表菜单_页面 因此,如果我想获得页面“主页”可用的所有菜单,我在模型中定义了一个关系: public function getAllMenus() { return $this->hasMany(Menu::className(), ['id' => 'menu_id'])->viaTable(PageMenu::tableName(), ['page_id' => 'id']); } 但现在我们在菜单表中添加了

为了简单起见,假设我有3个表:
菜单
页面
和一个连接表
菜单_页面

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

public function getAllMenus() {
    return $this->hasMany(Menu::className(), ['id' => 'menu_id'])->viaTable(PageMenu::tableName(), ['page_id' => 'id']);
}
但现在我们在菜单表中添加了一个名为
show_all_pages
的属性,如果该属性设置为1,则应返回菜单,否则应检查是否已启用菜单在主页上使用

有没有办法在此处添加此条件?

您可以使用子句在
show\u all\u页面上应用此筛选器

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

    }

您希望它在关系中全局集成,还是任何特定的
控制器
操作
都需要它?在关系中,下面的答案应该有效。如果我理解正确,您在查询上添加了一个额外条件,该查询已经在与页面菜单进行连接。其思想是,菜单可以有字段显示所有页面,但页面菜单表上没有记录。@Eduardo“您在查询上添加了一个额外的条件,该查询已经在与页面菜单进行连接”-这是正确的,但是我不理解您的评论的下一部分,但实际上,这个
和WHERE
用于将
show_all_pages=1
添加到生成的sqlMy case I need的
WHERE
子句中,或者使用viaTable或show_all_pages属性条件进行连接,两者都不能应用。