Laravel:找出变量是否是集合

时间:2016-01-05 18:50:02

标签: php laravel collections

我想知道变量是否是一个集合。

我不能使用is_object(),因为即使它不是集合也是如此。 现在我使用它,它的工作原理:

if(is_object($images) && get_class($images) != 'Illuminate\Database\Eloquent\Collection') {

但我认为这太丑了,我花时间问你另一种解决方案。

你有什么想法吗?

5 个答案:

答案 0 :(得分:30)

你不能使用

if(is_a($images, 'Illuminate\Database\Eloquent\Collection')) {
    ....do whatever for a collection....
} else {
    ....do whatever for not a collection....
}

if ($images instanceof Illuminate\Database\Eloquent\Collection) {

}

答案 1 :(得分:17)

The class being used is incorrect here. In a general sense, you should be testing for the base class.

use Illuminate\Support\Collection;

....
if($images instanceof Collection) { 
 ....
}

答案 2 :(得分:3)

@Konchong 的回答指出了这一点,但我想对其他人做出明确说明。

Illuminate\Support\Collection 是 Laravel 中许多类型集合使用的基类,而 Illuminate\Database\Eloquent\Collection 是扩展基类但具有附加功能的基类,在其代码中,将基类作为别名类作为 BaseCollection。这就是您通过模型类和get() 之类的函数执行查询构建器时获得的结果。一个普通的集合是用 collect(["my", "array"]) 代替的。

请注意,这两个类都会产生一组不同的方法。例如,loadloadMissingRelation 和许多其他方法存在于子类中,而父类中不存在。然而,在数据库子类中的方法内部,有许多转义舱 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;

注意以下是错误

collect(["hello im a", "base collection"]) instanceof \Illuminate\Database\Eloquent\Collection;
is_array(collect(["hello im a", "base collection"]));

请注意,虽然集合本质上是数组的包装器并具有非常强大的方法,但它不是数组,并且在标准 php 数组函数中经常会失败或抛出异常。

答案 3 :(得分:2)

function is_collection($param): bool
{
    return (bool) (($param instanceof \Illuminate\Support\Collection) || ($param instanceof \Illuminate\Database\Eloquent\Collection));
}

如果你经常使用它,你可能只想为它制作函数。

@Konchog 和@Jonathan Ma 的组合回答。

答案 4 :(得分:-2)

对我来说,使用is_countable可行:

if(is_countable($somethingCountable)) {
// do something with array
} else {
// print something else

}

Read more about is_countable