GridView 中相关模型的过滤器设置
Filter setup for related model in GridView
我正在尝试在 Yii2 的 GridView 小部件中为相关模型设置过滤器,但我一直收到错误消息,例如过滤器值必须是整数。
我关注了this question。现在,我有两个模型 Services.php
和 ServiceCharge.php
。
在 ServiceCharge.php
中,关系设置如下:
public function getServiceName()
{
return $this->hasOne(Services::className(),['id'=>'service_name']);
}
在ServiceChargeSearch.php
中的代码是这样的:
<?php
namespace app\models;
use Yii;
use yii\base\Model;
use yii\data\ActiveDataProvider;
use app\models\ServiceCharges;
/**
* ServiceChargesSearch represents the model behind the search form about `app\models\ServiceCharges`.
*/
class ServiceChargesSearch extends ServiceCharges
{
/**
* @inheritdoc
*/
public function attributes()
{
// add related fields to searchable attributes
return array_merge(parent::attributes(), ['serviceName.services']);
}
public function rules()
{
return [
[['id'], 'integer'],
[['charges_cash', 'charges_cashless'], 'number'],
[['id', 'serviceName.services', 'room_category'], 'safe'],
];
}
/**
* @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 = ServiceCharges::find();
$dataProvider = new ActiveDataProvider([
'query' => $query,
]);
$dataProvider->sort->attributes['serviceName.services'] = [
'asc' => ['serviceName.services' => SORT_ASC],
'desc' => ['serviceName.services' => SORT_DESC],
];
$query->joinWith(['serviceName']);
$this->load($params);
if (!$this->validate()) {
// uncomment the following line if you do not want to any records when validation fails
// $query->where('0=1');
return $dataProvider;
}
$query->andFilterWhere([
'id' => $this->id,
// 'service_name' => $this->service_name,
'room_category' => $this->room_category,
'charges_cash' => $this->charges_cash,
'charges_cashless' => $this->charges_cashless,
])
->andFilterWhere(['LIKE', 'serviceName.services', $this->getAttribute('serviceName.services')]);
return $dataProvider;
}
}
在我的 Gridview 中,它是这样设置的:
[
'attribute'=>'service_name',
'value'=>'serviceName.services',
],
正确显示相关模型的服务名称。
我看不出我做错了什么,但是服务属性的筛选字段根本没有显示。
其实比看起来简单多了。
将column_name
添加到安全属性。
注意:这应该是关系 Name
添加与查询的连接 - 如 - $query->joinWith(['serviceName','roomCategory']);
添加过滤条件如:
->andFilterWhere(['like', 'services.services', $this->service_name])
->andFilterWhere(['like', 'room_category.room_category', $this->room_category]);
如果要添加排序,请添加如下代码:
$dataProvider->sort->attributes['service_name'] = [
'asc' => ['services.services' => SORT_ASC],
'desc' => ['services.services' => SORT_DESC],
];
$dataProvider->sort->attributes['room_category'] = [
'asc' => ['room_category.room_category' => SORT_ASC],
'desc' => ['room_category.room_category' => SORT_DESC],
];
5 你还应该设置关系名称说 public $roomCategory
就是这样。相关 table 的排序和过滤都完美无缺。
注意:删除相关列的整数等默认验证和 gii
生成的默认过滤,否则会产生错误。
最新版本更新:
- 不需要添加 Public $属性。
- 也不需要为关系添加安全属性。
- 但是你当前模型中你想要过滤的属性是
添加到安全属性是必须的。
- 最重要的是,在您的 gridview 中,相关属性必须
采用闭包格式。
这就是例子
[
'attribute=>'attribute_name',
'value=function($data){
return $data->relationname->related_table_attribute_name
}
],
请记住,您正在使用 relation_name.related_table_attribute_name
过滤器,但不知何故对我不起作用。
有一套相当全面的说明on the Yii Framework website。唯一需要注意的是,搜索模型会抱怨以下几行,但没有它们,一切似乎都按预期工作:
$this->addCondition(...);
对于模型,PaymentEvent (table: subs_payment_event),它有一个 currency_id 字段 linked 来模拟货币,这是额外的完整集合代码(使用基本模板):
在主模型中,PaymentEvent.php:
public function getCurrencyName()
{
return $this->currency->name;
}
在搜索模型中,PaymentEventSearch.php:
public $currencyName;
在其规则中:
[['currencyName'], 'safe'],
在其setSort语句的属性中,包括:
'currencyName' => [
'asc' => ['subs_currency.name' => SORT_ASC],
'desc' => ['subs_currency.name' => SORT_DESC],
'label' => 'Currency'
],
前格过滤条件:
$query->joinWith(['currency' => function ($q) {
$q->where('subs_currency.name LIKE "%' . $this->currencyName . '%"');
}]);
最后在GridView的columns数组中查看(包括我常用的link跨到相关模型记录):
[
'attribute' => 'currencyName',
'label' => 'Currency',
'format' => 'raw',
'value' => function ($data) {
return Html::a($data->currency->name, ['/currency/' . $data->currency_id]);
},
],
我正在尝试在 Yii2 的 GridView 小部件中为相关模型设置过滤器,但我一直收到错误消息,例如过滤器值必须是整数。
我关注了this question。现在,我有两个模型 Services.php
和 ServiceCharge.php
。
在 ServiceCharge.php
中,关系设置如下:
public function getServiceName()
{
return $this->hasOne(Services::className(),['id'=>'service_name']);
}
在ServiceChargeSearch.php
中的代码是这样的:
<?php
namespace app\models;
use Yii;
use yii\base\Model;
use yii\data\ActiveDataProvider;
use app\models\ServiceCharges;
/**
* ServiceChargesSearch represents the model behind the search form about `app\models\ServiceCharges`.
*/
class ServiceChargesSearch extends ServiceCharges
{
/**
* @inheritdoc
*/
public function attributes()
{
// add related fields to searchable attributes
return array_merge(parent::attributes(), ['serviceName.services']);
}
public function rules()
{
return [
[['id'], 'integer'],
[['charges_cash', 'charges_cashless'], 'number'],
[['id', 'serviceName.services', 'room_category'], 'safe'],
];
}
/**
* @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 = ServiceCharges::find();
$dataProvider = new ActiveDataProvider([
'query' => $query,
]);
$dataProvider->sort->attributes['serviceName.services'] = [
'asc' => ['serviceName.services' => SORT_ASC],
'desc' => ['serviceName.services' => SORT_DESC],
];
$query->joinWith(['serviceName']);
$this->load($params);
if (!$this->validate()) {
// uncomment the following line if you do not want to any records when validation fails
// $query->where('0=1');
return $dataProvider;
}
$query->andFilterWhere([
'id' => $this->id,
// 'service_name' => $this->service_name,
'room_category' => $this->room_category,
'charges_cash' => $this->charges_cash,
'charges_cashless' => $this->charges_cashless,
])
->andFilterWhere(['LIKE', 'serviceName.services', $this->getAttribute('serviceName.services')]);
return $dataProvider;
}
}
在我的 Gridview 中,它是这样设置的:
[
'attribute'=>'service_name',
'value'=>'serviceName.services',
],
正确显示相关模型的服务名称。
我看不出我做错了什么,但是服务属性的筛选字段根本没有显示。
其实比看起来简单多了。
将
column_name
添加到安全属性。 注意:这应该是关系 Name添加与查询的连接 - 如 -
$query->joinWith(['serviceName','roomCategory']);
添加过滤条件如:
->andFilterWhere(['like', 'services.services', $this->service_name]) ->andFilterWhere(['like', 'room_category.room_category', $this->room_category]);
如果要添加排序,请添加如下代码:
$dataProvider->sort->attributes['service_name'] = [ 'asc' => ['services.services' => SORT_ASC], 'desc' => ['services.services' => SORT_DESC], ]; $dataProvider->sort->attributes['room_category'] = [ 'asc' => ['room_category.room_category' => SORT_ASC], 'desc' => ['room_category.room_category' => SORT_DESC], ];
5 你还应该设置关系名称说 public $roomCategory
就是这样。相关 table 的排序和过滤都完美无缺。
注意:删除相关列的整数等默认验证和 gii
生成的默认过滤,否则会产生错误。
最新版本更新:
- 不需要添加 Public $属性。
- 也不需要为关系添加安全属性。
- 但是你当前模型中你想要过滤的属性是 添加到安全属性是必须的。
- 最重要的是,在您的 gridview 中,相关属性必须 采用闭包格式。
这就是例子
[
'attribute=>'attribute_name',
'value=function($data){
return $data->relationname->related_table_attribute_name
}
],
请记住,您正在使用 relation_name.related_table_attribute_name
过滤器,但不知何故对我不起作用。
有一套相当全面的说明on the Yii Framework website。唯一需要注意的是,搜索模型会抱怨以下几行,但没有它们,一切似乎都按预期工作:
$this->addCondition(...);
对于模型,PaymentEvent (table: subs_payment_event),它有一个 currency_id 字段 linked 来模拟货币,这是额外的完整集合代码(使用基本模板):
在主模型中,PaymentEvent.php:
public function getCurrencyName()
{
return $this->currency->name;
}
在搜索模型中,PaymentEventSearch.php:
public $currencyName;
在其规则中:
[['currencyName'], 'safe'],
在其setSort语句的属性中,包括:
'currencyName' => [
'asc' => ['subs_currency.name' => SORT_ASC],
'desc' => ['subs_currency.name' => SORT_DESC],
'label' => 'Currency'
],
前格过滤条件:
$query->joinWith(['currency' => function ($q) {
$q->where('subs_currency.name LIKE "%' . $this->currencyName . '%"');
}]);
最后在GridView的columns数组中查看(包括我常用的link跨到相关模型记录):
[
'attribute' => 'currencyName',
'label' => 'Currency',
'format' => 'raw',
'value' => function ($data) {
return Html::a($data->currency->name, ['/currency/' . $data->currency_id]);
},
],