如何显示布尔作为复选框列表并通过它进行搜索?

时间:2019-03-28 08:38:24

标签: php yii2

我有一个DB / model字段,该字段具有可为null的布尔类型(它是布尔值,但可以为null)。将它作为单个字段显示在ActiveFormGridView中并通过它进行搜索是没有问题的:

$query->andFilterWhere(['is_manager' => $this->is_manager,]);

但是如果必须将其显示为两个复选框,如何在ActiveForm中显示它以在元素的LIST中搜索?示例:

enter image description here

因此,客户可以选择以下选项:

  • 用户是管理员
  • 用户不是管理员
  • 两者
  • 都不是

UPD:我将尝试解释:这是由 LIST 个用户搜索的,而不是是一个用户的搜索。因此结果可以包含两个选项,例如用户1是管理员,用户2-不是管理员。如果我选中两个复选框-结果将同时显示两个复选框。如果选中其中之一-结果将显示其中之一。

3 个答案:

答案 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_manageris_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种状态(在现实生活中): 一个人是:

  1. 不是经理(否)
  2. 经理(是)
  3. 不确定(NULL)

要进行搜索,可以选择“与我无关”。

我建议您在搜索表单中显示一个下拉列表:

  • 是(值“ 1”)
  • 否(值“ 0”)
  • 不确定(值“ NULL”)
  • 无关紧要(值“”)

在您的php中,您将这些搜索选项转换为将字段分别比较为1、0,null和“无所谓”时不进行比较。 我假设您数据库中的字段is_manager为可空的tinyint(1)。