Yii2 模型 ViaTable
Yii2 Model ViaTable
为简单起见,假设我有 3 个 table:menu
、page
和一个交汇点 table menu_page
.
因此,如果我想获取页面 "home" 可用的所有菜单,我在模型中定义了一个关系:
public function getAllMenus() {
return $this->hasMany(Menu::className(), ['id' => 'menu_id'])->viaTable(PageMenu::tableName(), ['page_id' => 'id']);
}
但是现在我们在菜单table中添加了一个名为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);
}
为简单起见,假设我有 3 个 table:menu
、page
和一个交汇点 table menu_page
.
因此,如果我想获取页面 "home" 可用的所有菜单,我在模型中定义了一个关系:
public function getAllMenus() {
return $this->hasMany(Menu::className(), ['id' => 'menu_id'])->viaTable(PageMenu::tableName(), ['page_id' => 'id']);
}
但是现在我们在菜单table中添加了一个名为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);
}