Mr *_*bri 16 php entity-relationship yii2
继此之后:
Yii2 SearchModel中的search()如何工作?
我希望能够过滤一GridView列关系数据.这就是我的意思:
我有两张桌子,TableA和TableB.两者都有使用Gii生成的相应模型.TableA有一个值的外键TableB,如下所示:
TableA
attrA1, attrA2, attrA3, TableB.attrB1
TableB
attrB1, attrB2, attrB3
Run Code Online (Sandbox Code Playgroud)
attrA1和attrB1是其相应表的主键.
现在,我有一个Yii2 GridView的attrA2,attrA3和attrB2.我有一个工作过滤器attrA2,attrA3所以我可以搜索列值.我也对这两个列进行了工作排序 - 只需单击列标题即可.我希望能够添加此过滤和排序attrB2.
我的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;
}
Run Code Online (Sandbox Code Playgroud)
在我的TableA模型中,我设置了相关的值
public $relationalValue;
public function afterFind(){
$b = TableB::find(['attrB1' => $this->attrB1]);
$this->relationalValue = $b->relationalValue;
}
Run Code Online (Sandbox Code Playgroud)
虽然这可能不是最好的方法.我想我必须在我的搜索功能中使用$ relationalValue,但我不确定如何.同样,我希望能够通过此列太排序-就像我可以为attrA2并AttrA3通过点击标题link`.任何帮助,将不胜感激.谢谢.
小智 18
这基于指南中的描述.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']
];
}
Run Code Online (Sandbox Code Playgroud)
然后在TableASearch->search()添加(之前$this->load()):
$dataProvider->sort->attributes['TableB.attrB1'] = [
'asc' => ['TableB.attrB1' => SORT_ASC],
'desc' => ['TableB.attrB1' => SORT_DESC],
];
$query->joinWith(['TableB']);
Run Code Online (Sandbox Code Playgroud)
然后实际搜索您的数据(如下$this->load()):
$query->andFilterWhere([
'like',
'TableB.attrB1',
$this->getAttribute('TableB.attrB1')
]);
Run Code Online (Sandbox Code Playgroud)
2.配置 GridView
添加到您的视图:
echo GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'columns' => [
/* Other columns */
'TableB1.attrB1',
/* Other columns */
]
]);
Run Code Online (Sandbox Code Playgroud)
在 Yii 2.0 中按列过滤 gridview 非常简单。请将过滤器属性添加到具有查找值的 gridview 列,如下所示:
[
"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",
],
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
20965 次 |
| 最近记录: |