2017-10-04 33 views
0

我有一个用于显示数据的gridView。 GridView的表中有一个是被称为创建列,此列包含用户,我从用户表得到ID的。基本上,此列会显示这样的数据作为整数(ID):Yii2 Gridview过滤基于varchar作为输入值的Int数据类型的列

enter image description here

但我给自己定这样的代码来显示ID用户名

[ 
    'attribute' => 'created_by', 
    'format' => 'raw', 
    'value' => function ($data) { 
       $modelUser = Users::find()->where(['id' => $data->created_by])->one(); 
       $nama = $modelUser->username; 
       return $nama; 
      }, 
    'vAlign' => 'middle', 
    'hAlign' => 'center', 
], 

结果

enter image description here

gridView有过滤器列,我试图根据插入的值过滤数据。我想输入的用户名作为过滤值,但它给出错误信息“通过创建必须是整数”,像这样:

enter image description here

我如何可以使用过滤该列用户名(VARCHAR)?

感谢

更新

这是我searchModel.php

<?php 

namespace app\search; 

use Yii; 
use yii\base\Model; 
use yii\data\ActiveDataProvider; 
use app\models\Product; 

/** 
* ProductSearch represents the model behind the search form of `app\models\Product`. 
*/ 
class ProductSearch extends Product { 

/** 
* @inheritdoc 
*/ 
public function rules() { 
    return [ 
     [['productId', 'userId', 'parentId', 'created_by'], 'integer'], 
     [['date', 'created_at', 'name', 'address'], 'safe'], 
     [['price'], 'number'], 
    ]; 
} 

/** 
* @inheritdoc 
*/ 
public function scenarios() { 
    // bypass scenarios() implementation in the parent class 
    return Model::scenarios(); 
} 

/** 
* Creates data provider instance with search query applied 
* 
* @param array $params 
* 
* @return ActiveDataProvider 
*/ 
public function search($params) { 
    $query = Product::find(); 

    // add conditions that should always apply here 

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

    $this->load($params); 

    if (!$this->validate()) { 
     // uncomment the following line if you do not want to return any records when validation fails 
     return $dataProvider; 
    } 

    // grid filtering conditions 
    $query->andFilterWhere([ 
     'productId' => $this->productId, 
     'price' => $this->price, 
     'created_at' => $this->created_at, 
     'created_by' => $this->created_by, 
    ]); 

    $query->andFilterWhere(['MONTH(date)' => $this->date]) 
      ->andFilterWhere(['like', 'name', $this->name]) 
      ->andFilterWhere(['like', 'address', $this->address]); 

    return $dataProvider; 
} 

} 

回答

1
public function rules() 
{ 
    return [ 
     [['productId', 'userId', 'parentId'], 'integer'], 
     [['date', 'created_at', 'name', 'address'], 'safe'], 
     [['price'], 'number'], 
     [['created_by'], 'string'], 
    ]; 
} 

public function search($params) 
{ 
    $query = Product::find()->joinWith('createdBy'); // Whatever relation name 
. 
. 
. 
. 
. 
    // grid filtering conditions 
    $query->andFilterWhere([ 
     'productId' => $this->productId, 
     'price' => $this->price, 
     'created_at' => $this->created_at, 
    ]); 

    $query->andFilterWhere(['MONTH(date)' => $this->date]) 
     ->andFilterWhere(['like', 'name', $this->name]) 
     ->andFilterWhere(['like', 'address', $this->address]) 
     ->andFilterWhere(['like', 'userTableName.username', $this->created_by]); // Whatever table name and field name. 


    return $dataProvider; 
} 
+0

这是工作,但我必须首先创建模型关系。因为我的表格两者之间没有关系。感谢:D – Blackjack

+0

但是,如果我有另一列,例如列**电子邮件**,我该如何才能使其工作。该列电子邮件基于用户ID,就像创建者一样。我尝试使用相同的关系,或者只是使用预览关系。但它不起作用。 – Blackjack

+0

@Blackjack。你想通过电子邮件或用户名过滤用户吗?说明。 –

1

你应该适当的过滤器添加到您的列

[ 
    'attribute'=>'your_attribute', 
    ...... 
    'filter'=>ArrayHelper::map(YourModel::find()->asArray()->all(), 
        'your_id_column', 'your_name_column'), 
], 
相关问题