PHP, Yii2 GridView 对关系值的过滤

2022-08-30 21:05:33

从此开始:

Yii2 SearchModel 中的 search() 如何工作?

我希望能够筛选一列关系数据。这就是我的意思:GridView

我有两张桌子,还有.两者都使用Gii生成了相应的模型。 具有 中值的外键,如下所示:TableATableBTableATableB

TableA
attrA1, attrA2, attrA3, TableB.attrB1

TableB
attrB1, attrB2, attrB3

attrA1 和 attrB1 是其相应表的主键。

现在,我有一个 Yii2 的 、 和 。我有一个工作过滤器,所以我可以搜索列值。我也有这两列的工作排序 - 只需单击列标题即可。我希望能够添加此过滤和排序。GridViewattrA2attrA3attrB2attrA2attrA3attrB2

我的模型看起来像这样:TableASearch

public function search($params){
    $query = TableA::find();
    $dataProvider = new ActiveDataProvider([
        'query' => $query,
    ]);

    if (!($this->load($params) && $this->validate())) {
        return $dataProvider;
    }

    $this->addCondition($query, 'attrA2');
    $this->addCondition($query, 'attrA2', true);
    $this->addCondition($query, 'attrA3');
    $this->addCondition($query, 'attrA3', true);

    return $dataProvider;
}

在我的模型中,我像这样设置相关值TableA

    public $relationalValue;

public function afterFind(){
    $b = TableB::find(['attrB1' => $this->attrB1]);
    $this->relationalValue = $b->relationalValue;
}

尽管这可能不是执行此操作的最佳方法。我想我必须在搜索功能的某个地方使用$relationalValue,但我不确定如何。同样,我也希望能够按此列进行排序 - 就像我一样,通过单击标题链接。任何帮助将不胜感激。谢谢。attrA2AttrA3


答案 1

这是基于指南中的说明。SearchModel 的基本代码来自 Gii 代码生成器。这也是假设$this->TableB已使用或关系设置。请参阅此文档hasOne()hasMany()

1. 设置搜索模型

在模型中添加:TableASearch

public function attributes()
{
    // add related fields to searchable attributes
    return array_merge(parent::attributes(), ['TableB.attrB1']);
}

public function rules() 
{
    return [
        /* your other rules */
        [['TableB.attrB1'], 'safe']
    ];
}

然后在添加(之前):TableASearch->search()$this->load()

$dataProvider->sort->attributes['TableB.attrB1'] = [
      'asc' => ['TableB.attrB1' => SORT_ASC],
      'desc' => ['TableB.attrB1' => SORT_DESC],
 ];

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

然后实际搜索您的数据(如下):$this->load()

$query->andFilterWhere([
    'like',
    'TableB.attrB1',
     $this->getAttribute('TableB.attrB1')
]);

2. 配置网格视图

添加到您的视图:

echo GridView::widget([
    'dataProvider' => $dataProvider,
    'filterModel' => $searchModel,
    'columns' => [
        /* Other columns */
       'TableB1.attrB1',
        /* Other columns */        
     ]
]);

答案 2

在 Yii 2.0 中,按列过滤网格视图非常容易。请将过滤器属性添加到具有查找值的网格视图列中,如下所示:

[
        "class" => yii\grid\DataColumn::className(),
        "attribute" => "status_id",
        'filter' => ArrayHelper::map(Status::find()->orderBy('name')->asArray()->all(), 'id', 'name'),
        "value" => function($model){
            if ($rel = $model->getStatus()->one()) {
                return yii\helpers\Html::a($rel->name,["crud/status/view", 'id' => $rel->id,],["data-pjax"=>0]);
            } else {
                return '';
            }
        },
        "format" => "raw",
], 

推荐