Php 如何将bool显示为复选框列表并按其进行搜索?
我有一个DB/model字段,它有一个可为null的bool类型(它是布尔型的,但可以为null)。在Php 如何将bool显示为复选框列表并按其进行搜索?,php,yii2,Php,Yii2,我有一个DB/model字段,它有一个可为null的bool类型(它是布尔型的,但可以为null)。在ActiveForm或GridView中将其作为单个字段显示并按其进行搜索没有问题: $query->andFilterWhere(['is_manager' => $this->is_manager,]); 但是当它必须显示为两个复选框时,如何在ActiveForm中显示它,以便在元素的列表中进行搜索?例如: 因此,客户可以选择以下选项: 用户是经理 用户不是经理 两者
ActiveForm
或GridView
中将其作为单个字段显示并按其进行搜索没有问题:
$query->andFilterWhere(['is_manager' => $this->is_manager,]);
但是当它必须显示为两个复选框时,如何在ActiveForm
中显示它,以便在元素的列表中进行搜索?例如:
因此,客户可以选择以下选项:
- 用户是经理
- 用户不是经理
- 两者
- 没有一个
UPD:我试着解释一下:这是一个由列表用户进行的搜索,而不是由一个用户进行的搜索。所以结果可以包含这两个选项,例如用户1是经理,用户2-不是经理。如果我选中两个复选框,结果将同时显示这两个复选框。如果检查其中一个,结果将显示其中一个。很抱歉我反应太晚,我不得不离开一会儿。好的,你是对的,四个可能的答案在搜索的情况下是有意义的。在我看来,在这种情况下,两个复选框代表一个布尔值。我们叫他们,
是管理者,不是管理者。如果布尔值为false
则不应用任何过滤器,否则为。在PHP代码中:
if ($this->is_manager) $query->andFilterWhere(['is_manager' => 'true']);
if ($this->is_not_manager) $query->andFilterWhere(['is_manager' => 'false']);
这里的假设是,$this->is_manager
和$this->is_not_manager
表示复选框中的两个布尔值
这对您有意义吗?如前所述:
我能想到的只有3种状态(在现实生活中):
一个人是:
不是经理(否)
经理(是的)
未确定(空)
对于搜索,可以方便地选择“不在乎我”
我建议在搜索表单中显示以下内容:
- 是(值“1”)
- 否(值“0”)
- 待定(值“空”)
- 无所谓(值“”)
在php中,您可以将这些搜索选项转换为将字段分别与1、0、null和no comparison进行比较,以防出现“无关紧要”的情况。
我假设数据库中a字段的tinyint(1)为空,即a管理器
,结果如下:
在主模型中,我创建了一个虚拟财产:
public $isManagerArray = [];
在搜索模型中
我添加了一条规则:
public function rules() {
return [
['isManagerArray', 'in', 'range' => [true, false]],
];
}
在search
方法中,我添加了一个条件:
public function search($params) {
....
if (count($this->isManagerArray) > 1) {
$query->where(['AND',['OR',[ 'is_manager' => true],['is_manager' => false]]]);
} else if (count($this->isManagerArray) > 0) {
$query->andFilterWhere([ 'is_manager' => $this->isManagerArray[0] ]);
}
...
}
我的\u search.php
视图文件具有:
<?php $form = ActiveForm::begin(); ?>
<?= Html::checkboxList($model->formName().'[isManagerArray]', null, [1 => 'Yes', 0 => 'No']); ?>
<?php ActiveForm::end(); ?>
如果有更好的解决方案,请分享谢谢您的回答。我决定做一个虚拟财产和它的工作评论是不为延长讨论;这段对话已经结束。如果需要更多信息,请务必回答您的问题。