Alb*_*ert 22 php collections laravel
我想知道变量是否是一个集合.
我不能使用is_object(),因为即使它不是集合也是如此.现在我使用它,它的工作原理:
if(is_object($images) && get_class($images) != 'Illuminate\Database\Eloquent\Collection') {
Run Code Online (Sandbox Code Playgroud)
但我觉得这太丑了,我花时间问你另一种解决方案.
你有什么主意吗?
小智 37
你不能用
if(is_a($images, 'Illuminate\Database\Eloquent\Collection')) {
....do whatever for a collection....
} else {
....do whatever for not a collection....
}
Run Code Online (Sandbox Code Playgroud)
要么
if ($images instanceof Illuminate\Database\Eloquent\Collection) {
}
Run Code Online (Sandbox Code Playgroud)
Kon*_*hog 27
这里使用的类不正确.在一般意义上,您应该测试基类.
use Illuminate\Support\Collection;
....
if($images instanceof Collection) {
....
}
Run Code Online (Sandbox Code Playgroud)
function is_collection($param): bool
{
return (bool) (($param instanceof \Illuminate\Support\Collection) || ($param instanceof \Illuminate\Database\Eloquent\Collection));
}
Run Code Online (Sandbox Code Playgroud)
如果您经常使用它,您可能只想为其提供功能。
@Konchog 和 @Jonathan Ma 答案的组合。
@Konchong 的答案指出了这一点,但我想向其他人明确指出这一点。
Illuminate\Support\CollectionLaravel 中许多类型的集合使用的基类与 之间存在差异,Illuminate\Database\Eloquent\Collection它扩展了基类,但具有附加功能,并且在其代码中将基类别名为 BaseCollection。这是通过模型类和get()等函数执行查询生成器时得到的结果。一个普通的集合是用它制作的collect(["my", "array"])。
请注意,这两个类都会产生一组不同的方法。例如,load、loadMissingRelation和许多其他方法存在于子类中,而父类中不存在。然而,数据库子类中的方法内部有许多逃生口 if 语句,这些语句确保如果有人以非预期的方式意外使用子类(例如向集合中添加元素),则收藏不会中断。
请注意,以下内容是正确的:
User::get() instanceof \Illuminate\Database\Eloquent\Collection;
User::get() instanceof \Illuminate\Support\Collection;
collect(["hello", "i", "am", "a", "base", "collection"]) instanceof \Illuminate\Support\Collection;
Run Code Online (Sandbox Code Playgroud)
请注意,以下内容是错误的:
collect(["hello im a", "base collection"]) instanceof \Illuminate\Database\Eloquent\Collection;
is_array(collect(["hello im a", "base collection"]));
Run Code Online (Sandbox Code Playgroud)
请注意,虽然集合本质上是数组的包装器,并且具有非常强大的方法,但它不是数组,并且在标准 php 数组函数中经常会失败或抛出异常。