GridView::Widget 从另一个 table 搜索数据

GridView::Widget search data from another table

我有一个 GridView::widget 是用这个方法填充的:

StabilimentiController.php

public static function getGridColumns($isMine = true, $readonly = false) {
 $c = [
            'denominazione',
            [
                'attribute'      => 'provincia',
                'value'          => 'indirizzo.provincia',
                'headerOptions'  => ['class' => 'table-col-provincia'],
                'contentOptions' => ['class' => 'table-col-provincia'],
            ],
            [
                'attribute'      => 'created_by',
                'value'          => 'azienda.ragioneSociale',
                'headerOptions'  => ['class' => 'table-col-createdBy'],
                'contentOptions' => ['class' => 'table-col-createdBy'],
            ]
    ];

return $c;
}

我在为字段 created_by 创建可搜索的输入框时遇到了一些问题。

Created_by在我的模型中定义为整数,它是唯一标识公司(azienda)的代码。

在我的 Stabilimenti.php 模型中,我有这个方法来捕获它,然后使用 getGridColumns 方法中的 .notation 我可以到达我感兴趣的 ragioneSociale 字段。

/**
     * @return \yii\db\ActiveQuery
*/
    public function getAzienda() {
        return $this->hasOne(Azienda::className(), ['id' => 'azienda_id'])->inverseOf('stabilimenti');
    }

输出是我想要的,唯一的问题是我的 GridView 中的可搜索字段将 int 代码而不是 ragioneSociale 字符串作为输入,并且不是很用户友好。

在我的StabilimentiSearch.php

public function rules(){
    return [
           [['id', 'azienda_id', 'created_by', 'updated_by'], 'integer'],
           [['denominazione', 'indirizzo', 'citta', 'localita', 'provincia', 'cap', 'produttore', 'utente', 'azienda' ], 'safe'],
             array('ragioneSociale', 'safe', 'on'=>'search'),
        ];

我将 ragioneSociale 设置为安全并带有搜索选项,但我在将其正确绑定到 inputBox 时遇到了一些困难。

参见。如果你想下拉,试试这个:

            [
                'attribute'      => 'created_by',
                'value'          => 'azienda.ragioneSociale',
                'headerOptions'  => ['class' => 'table-col-createdBy'],
                'contentOptions' => ['class' => 'table-col-createdBy'],
                'filter'         => ArrayHelper::map(Azienda::find()->asArray()->all(), 'id', 'ragioneSociale')
            ]

如果需要输入框和文本搜索,请参阅https://www.yiiframework.com/wiki/653/displaying-sorting-and-filtering-model-relations-on-a-gridview。搜索模型添加属性和过滤条件:


class StabilimentiSearch extends Stabilimenti
{
    public $ragioneSociale;

    public function rules()
    {
        return [
            // ... more stuff here
            [['ragioneSociale'], 'safe'],
            // ... more stuff here
        ];
    }

    public function search($params)
    {
        // create ActiveQuery
        $query = Tour::find();

        $query->joinWith(['azienda']);

        $dataProvider = new ActiveDataProvider([
            'query' => $query,
        ]);

        // No search? Then return data Provider
        if (!($this->load($params) && $this->validate())) {
            return $dataProvider;
        }
        // Some filters
        $query->andFilterWhere([
            //... other searched attributes here
        ])
        ->andFilterWhere(['like', 'azienda.ragioneSociale', $this->ragioneSociale]);

        return $dataProvider;
    }
}

并使用此 属性 作为 GridView 中的属性:

            [
                'attribute'      => 'ragioneSociale',
                'value'          => 'azienda.ragioneSociale',
                'headerOptions'  => ['class' => 'table-col-createdBy'],
                'contentOptions' => ['class' => 'table-col-createdBy'],
            ]