我有一个DB / model字段,该字段具有可为null的布尔类型(它是布尔值,但可以为null)。将它作为单个字段显示在ActiveForm
或GridView
中并通过它进行搜索是没有问题的:
$query->andFilterWhere(['is_manager' => $this->is_manager,]);
但是如果必须将其显示为两个复选框,如何在ActiveForm
中显示它以在元素的LIST中搜索?示例:
因此,客户可以选择以下选项:
UPD:我将尝试解释:这是由 LIST 个用户搜索的,而不是是一个用户的搜索。因此结果可以包含两个选项,例如用户1是管理员,用户2-不是管理员。如果我选中两个复选框-结果将同时显示两个复选框。如果选中其中之一-结果将显示其中之一。
答案 0 :(得分:1)
结果:
在主模型中,我创建了一个虚拟属性:
public $isManagerArray = [];
在SearchModel
中,我添加了一条规则:
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] ]);
}
...
}
并且我的_search.php
视图文件具有:
<?php $form = ActiveForm::begin(); ?>
<?= Html::checkboxList($model->formName().'[isManagerArray]', null, [1 => 'Yes', 0 => 'No']); ?>
<?php ActiveForm::end(); ?>
如果有更好的解决方案-请分享
答案 1 :(得分:0)
对不起,我的反应很晚,我不得不离开了一段时间。好的,您是对的,在搜索的情况下,四个可能的答案确实有意义。如我所见,在那种情况下,两个复选框都代表一个布尔值。我们称它们为is_manager
和is_not_manager
。如果布尔值为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
代表复选框中的两个布尔值。
这对您有意义吗?
答案 2 :(得分:0)
如前所述: 我唯一能想到的是3种状态(在现实生活中): 一个人是:
要进行搜索,可以选择“与我无关”。
我建议您在搜索表单中显示一个下拉列表:
在您的php中,您将这些搜索选项转换为将字段分别比较为1、0,null和“无所谓”时不进行比较。
我假设您数据库中的字段is_manager
为可空的tinyint(1)。