【问题标题】:How to check if any of the fields of a model are null or empty?如何检查模型的任何字段是否为空或空?
【发布时间】:2015-09-03 18:54:39
【问题描述】:

我有一个模型,$userModel。我想检查此模型的任何字段是否为空或null

目前我正在使用一个大的 if 语句来做这件事。

if(!empty($userModel->name) && !empty($userModel->address) ... && !empty($userModel->email))
{
   // All fields have values
}

这种方式可行,但是如果以后我需要向模型中添加另一个字段,那么我需要返回到 if 并在那里添加另一个 && 条件。

我怎样才能在一次检查中做到这一点?

有没有类似:$userModel::model()->areAllFieldsFilled();


额外信息:模型已经保存在数据库中,不需要用户输入。这只是我检查特定模型的完整程度,绝不会在数据库中需要所有这些字段,只有少数。像$userModel->bio 这样的东西通常会留下null

我想避免检查 5 到 10 个字段。如果模型更改时必须保持巨人,我不想要巨人。

【问题讨论】:

    标签: php mysql sql yii model


    【解决方案1】:

    PHP 允许您iterate over an object's properties。可以使用empty() 简化对每个属性的检查:

    $allHaveValues = TRUE;
    foreach ($userModel as $key => $value) {
        if (empty($value)) {
           $allHaveValues = FALSE;
           break;
        }
    }
    
    if ($allHaveValues) {
        // Do something...
    }
    

    【讨论】:

    • $userModel 是一个object。这将引发错误。
    【解决方案2】:

    使用empty()

    if(!empty($userModel->name)) { .. }
    

    empty() DOCS

    • “”(空字符串)
    • 0(0为整数)
    • 0.0(0 作为浮点数)
    • “0”(0作为字符串)
    • 错误
    • array()(一个空数组)
    • $var; (声明的变量,但没有值)

    更新

    $modelData = array($userModel->name, $userModel->address, $userModel->email);
    if(!in_array('', $modelData) && !in_array(null, $modelData)) { .. }
    

    in_array()

    或者你可以使用array_intersect -

    if(empty(array_intersect(array('', null), $modelData))) { .. }
    

    array_intersect()

    【讨论】:

    • 这也有帮助,但我仍然想避免检查 5 到 10 个字段。我不想要一个巨大的if,当模型改变时必须维护它。
    • 也感谢您的帮助!
    【解决方案3】:

    我认为你不需要这样做。
    您需要的一切 - 它只是指定您的验证规则。
    例如:

    <?php
    
    class Brand extends CActiveRecord
    {
        public function tableName()
        {
            return 'brand';
        }
    
        public function rules()
        {
            return [
                ['name, country', 'on' => 'insert'],
                ['name', 'type', 'type' => 'string', 'on' => 'insert'],
                ['name', 'length', 'max' => 100, 'on' => 'insert'],
                ['name', 'type', 'type' => 'array', 'on' => 'search'],
                ['country', 'type', 'type' => 'string'],
                ['country', 'length', 'max' => 50],
            ];
        }
    }
    

    当您将使用此模型时,您只需通过 $model-&gt;validate() 验证此模型,如果失败 - 使用 $model-&gt;getErrors() 显示错误。此外,您可以指定您希望使用的规则场景。例如:$model-&gt;senario = 'search'; 将用于验证规则 search 和属性 name 应该是数组。但是当场景insert名称应该是长度不超过100的字符串。

    在我的示例字段中:姓名、国家/地区 - 插入所需的 (['name, country', 'on' =&gt; 'insert'])。

    【讨论】:

      猜你喜欢
      • 2022-12-18
      • 1970-01-01
      • 2014-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-28
      • 1970-01-01
      相关资源
      最近更新 更多