Join Yii2连接6个表+;网格中的下拉过滤器

Join Yii2连接6个表+;网格中的下拉过滤器,join,gridview,filter,yii2,Join,Gridview,Filter,Yii2,我有以下表格/型号:A、B、C、BC、D、BCD (A:B1:N)将表D连接到BCD不会有问题。但是,我想从A、B、C和D中筛选关键属性作为下拉列表,以在BCD中查找结果(因为最终我需要BCD)。在BCD中,在BCid和Did旁边,我当然可以存储Aid、Bid和Cid,在我看来这是一个相当简单的解决方法,但我知道这完全不利于db正常化。有没有其他更好的方法(当然是急着加载)? 我现在在BCD中看到了这一点: public function getB() { return $this-&g

我有以下表格/型号:A、B、C、BC、D、BCD

(A:B1:N)将表D连接到BCD不会有问题。但是,我想从A、B、C和D中筛选关键属性作为下拉列表,以在BCD中查找结果(因为最终我需要BCD)。在BCD中,在BCid和Did旁边,我当然可以存储Aid、Bid和Cid,在我看来这是一个相当简单的解决方法,但我知道这完全不利于db正常化。有没有其他更好的方法(当然是急着加载)? 我现在在BCD中看到了这一点:

public function getB() {
    return $this->hasOne(\app\models\B::className(), ['id' => 'Bid'])
                    ->via('BC');
}
这似乎是可行的,但它并不急于加载。 我怎样才能到达A型车?我可以在BCD中这样定义它吗

public function getA() {
    return $this->hasOne(\app\models\A::className(), ['id' => 'Aid'])
                    ->via('BC')
                    ->via(B);
}
它还没有真正起作用

通过这种方式工作(BCSearch):

BC中的关系A用“via”定义。下拉过滤器也可以工作。
但我仍然不知道如何在db结构中再深入一层。

这样看来它完全可以工作:

models/BCDSearch.php

public function search($params) {
    $query = BCD::find()
            ->select([
                'BCD.id',
                'BCD.amount',
                'A.id AS A_Id',
                'A.name AS A_name',
                'B.name AS B_name',
                'B.name2 AS B_name2',
                'C.name AS C_name',
                'D.name AS D_name',
                ])
            ->leftJoin('BC', 'BC.id = BC_Id')
            ->leftJoin('B', 'B.id = B_Id')
            ->leftJoin('A', 'A.id = A_Id')
            ->leftJoin('C', 'C.id = C_Id')
            ->leftJoin('D', 'D.id = D_Id');


    $query->andFilterWhere([
        ...
        'A.id' => $this->A_Id,
        'B.name' => $this->B_name,
        'B.name2' => $this->B_name2,
        'C.name' => $this->C_name,
        'D.name' => $this->D_name,
    ]);

public function rules() {
    return [
        ...
        [[... 'A_Id', 'B_name', 'B_name2', 'C_name', 'D_name'], 'safe'],
    ];
}
models/base/BCD.php:

class BCD extends Whatever {

    public $A_Id;
    public $A_name;
    public $B_name;
    public $B_name2;
    public $C_name;
    public $D_name;
views/BCD/index.php:

GridView::widget([
    'layout' => '{summary}{pager}{items}{pager}',
    'dataProvider' => $dataProvider,
    'pager' => [
        'class' => yii\widgets\LinkPager::className(),
        'firstPageLabel' => Yii::t('app', 'First'),
        'lastPageLabel' => Yii::t('app', 'Last')],
    'filterModel' => $searchModel,
    'columns' => [
    [
        'attribute' => 'A_Id',
        'value' => 'A_name',
        'filter' => yii\helpers\ArrayHelper::map(app\models\A::find()->all(), 'id', 'name')
    ],
    [
        'attribute' => 'B_name',
        'value' => 'B_name',
        'filter' => yii\helpers\ArrayHelper::map([['id' => 'name1', 'name' => 'name1'], ['id' => 'name2', 'name' => 'name2']], 'id', 'name')
    ],
    [
        'attribute' => 'B_name2',
        'value' => 'B_name2',
        'filter' => yii\helpers\ArrayHelper::map([['id' => 'name2_1', 'name' => 'name2_1'], ['id' => 'name2_2', 'name' => 'name2_2']], 'id', 'name')
    ],
    [
        'attribute' => 'C_name',
        'value' => 'C_name',
        'filter' => yii\helpers\ArrayHelper::map(app\models\C::find()->all(), 'C_name', 'C_name')
    ],
    [
        'attribute' => 'D_name',
        'value' => 'D_name',
        'filter' => yii\helpers\ArrayHelper::map(app\models\D::find()->all(), 'D_name', 'D_name')
    ],
    'amount',
    ...

希望这能帮助别人。要想出(至少对我来说)这个基本上很简单的解决方案并不容易。我不知道为什么,但到目前为止,我在网上找不到像这样的相关信息。

这样似乎完全有效:

models/BCDSearch.php

public function search($params) {
    $query = BCD::find()
            ->select([
                'BCD.id',
                'BCD.amount',
                'A.id AS A_Id',
                'A.name AS A_name',
                'B.name AS B_name',
                'B.name2 AS B_name2',
                'C.name AS C_name',
                'D.name AS D_name',
                ])
            ->leftJoin('BC', 'BC.id = BC_Id')
            ->leftJoin('B', 'B.id = B_Id')
            ->leftJoin('A', 'A.id = A_Id')
            ->leftJoin('C', 'C.id = C_Id')
            ->leftJoin('D', 'D.id = D_Id');


    $query->andFilterWhere([
        ...
        'A.id' => $this->A_Id,
        'B.name' => $this->B_name,
        'B.name2' => $this->B_name2,
        'C.name' => $this->C_name,
        'D.name' => $this->D_name,
    ]);

public function rules() {
    return [
        ...
        [[... 'A_Id', 'B_name', 'B_name2', 'C_name', 'D_name'], 'safe'],
    ];
}
models/base/BCD.php:

class BCD extends Whatever {

    public $A_Id;
    public $A_name;
    public $B_name;
    public $B_name2;
    public $C_name;
    public $D_name;
views/BCD/index.php:

GridView::widget([
    'layout' => '{summary}{pager}{items}{pager}',
    'dataProvider' => $dataProvider,
    'pager' => [
        'class' => yii\widgets\LinkPager::className(),
        'firstPageLabel' => Yii::t('app', 'First'),
        'lastPageLabel' => Yii::t('app', 'Last')],
    'filterModel' => $searchModel,
    'columns' => [
    [
        'attribute' => 'A_Id',
        'value' => 'A_name',
        'filter' => yii\helpers\ArrayHelper::map(app\models\A::find()->all(), 'id', 'name')
    ],
    [
        'attribute' => 'B_name',
        'value' => 'B_name',
        'filter' => yii\helpers\ArrayHelper::map([['id' => 'name1', 'name' => 'name1'], ['id' => 'name2', 'name' => 'name2']], 'id', 'name')
    ],
    [
        'attribute' => 'B_name2',
        'value' => 'B_name2',
        'filter' => yii\helpers\ArrayHelper::map([['id' => 'name2_1', 'name' => 'name2_1'], ['id' => 'name2_2', 'name' => 'name2_2']], 'id', 'name')
    ],
    [
        'attribute' => 'C_name',
        'value' => 'C_name',
        'filter' => yii\helpers\ArrayHelper::map(app\models\C::find()->all(), 'C_name', 'C_name')
    ],
    [
        'attribute' => 'D_name',
        'value' => 'D_name',
        'filter' => yii\helpers\ArrayHelper::map(app\models\D::find()->all(), 'D_name', 'D_name')
    ],
    'amount',
    ...
希望这能帮助别人。要想出(至少对我来说)这个基本上很简单的解决方案并不容易。我不知道为什么,但到目前为止,我在网上找不到像这样的相关信息