laravel 检查是否已填充所有模型属性

35g0bw71  于 2023-02-10  发布在  其他
关注(0)|答案(2)|浏览(130)

你好,我有一个用户的模型是additionalInfo,所以如果用户填写了这个附加信息,它将获得奖励,所以我需要检查是否填写了这个附加信息的所有值。我的问题是,我需要检查每个值吗?我的意思是,我是否需要使用$clientAdditionalInfo\['adress'\]按属性检查它,然后检查下一个$clientAdditionalInfo\['city'\],然后检查$clientAdditionalInfo\['province'\]等...
或者我应该这样做。

public function isCompleted() {
    $user = auth()->user();
    
            $clientAdditionalInfo = $user->client->additionalClientInfo->where('client_id', $user->client->id)->get()->first();
    
    if($clientAdditionalInfo){
                $attributes = $clientAdditionalInfo->getAttributes();
    
                foreach($attributes as $attribute) {
                    // HERE I COULD CHECK IF EVERY ATTRIBUTE IS FILLED?
                }
            }
}

尝试迭代每个属性,也许我应该检查每个属性是否isset,然后如果所有additionalInfo都已设置,则会给予奖励。但一旦所有属性都已设置,如何检查所有属性都已设置?
当我循环访问属性时,我看到最后一个值为null(在updated_at之后),但数据库中在数据库之后没有其他值,这可能是foreach的问题?数据库中只有一行,并且填充了所有值,如果我对foreach执行dump($key) & dump($attribute),我会得到以下结果:

^ "id"
^ 1
^ "address"
^ "Calle test 123"
^ "city"
^ "Barcelona"
^ "province"
^ "Barcelona"
^ "postal_code"
^ "08010"
^ "web"
^ "https://www.test.com"
^ "phone"
^ "123456789"
^ "activity"
^ "Social"
^ "number_of_employees"
^ 150
^ "interest"
^ "Test"
^ "client_id"
^ 8
^ "created_at"
^ "2023-02-08 10:48:56"
^ "updated_at"
^ "2023-02-08 11:53:43"
^ null

我不知道这个空值是从哪里来的,它不应该...
好吧,我的错,我是检查它badm我应该检查它从$request-〉all()。这样我就可以检查没有created_atupdated_at的值,所以我可以更具体,更好地检查它。

daolsyd0

daolsyd01#

最简单的方法是像你在问题中建议的那样有一个循环:

$attributes = $clientAdditionalInfo->getAttributes();
foreach ($attributes as $key => $value) {
    //Check whether the attribute is set properly
}

然而,这并不总是容易的。有时候,属性的默认值不是null,而是设置为默认值。例如,您可能具有'NOTSET''UNINITIALIZED''INITIALIZED''FINALIZED'等值。在这种情况下,您需要检查该值是否为'NOTSET'。此外,你的属性可能默认为0,而正确的值是严格正的(例如价格)。2因此,你可能有更多的函数/标准来评估你可能拥有的不同种类的属性。
另外,很有可能你在某个地方有一个null值,但是它是完美的,并且被正确地初始化了,例如,死亡日期是未知的,也就是说,null代表的是目前还活着的人。
此外,很有可能你有一个复合属性,比如一些项目,它是一个项目数组,每个项目都有自己的属性,在这种情况下,你需要为它们循环,所以为数组或StdClass对象等可迭代集合实现function是有意义的。
最后,您可能有一些对象示例需要作为附加信息的属性进行特殊评估。例如,如果健康状况是附加信息的一部分,则健康状况可能是一个独立的对象。
您可以将json_encode这样的对象,然后将json_decode放入一个数组中,并将其作为属性数组进行处理(嵌套与否)。或者,你可以为你的类创建一个期望属性的数组,然后循环它。后者的优点是如果你愿意,允许一些属性不被初始化,但是,缺点是你需要注意它,并且可能需要调整它。2你也可以半自动地做这件事,方法是在每次构建/部署时跟踪新属性,并假设新属性是必需的。
但是,回到最简单的方法,它看起来像这样:

foreach ($attributes as $attribute) {
    if ((!isset($yourObject->{$attribute}))) {
        return false; //something was not initialized
    }
}
return true; //we reached this point after looping everything and finding everything being initialized

上面的方法没有经过测试,你可能需要在你的情况下用稍微不同的方法来执行,这取决于你的对象和集合看起来是如何相似的,但是这个想法是循环属性,看看每个属性是否设置正确,如果没有,返回false。一旦所有的东西都检查过了,并且发现初始化正确,返回true。

pw9qyyiw

pw9qyyiw2#

使用array_filter

if(!array_diff($attributes, array_filter($attributes))) {
   echo 'All attributes are filled';
}

如果未提供回调,则删除数组中所有等于FALSE的项。

相关问题