我需要一种快速的方法来判断对象是否在集合中。我正在构建一个模板,管理员可以在其中为用户分配角色。下面的陈述基本上就是我想要完成的事情。
是此角色集合中主键值为5的角色。
我在做什么(显然是愚蠢到一个文件):
<?php
// The user
$user = User::find(1);
// Array of roles the user is associated with. Fetched via a pivot table
$tmpUserRoles = $user->roles->toArray();
// Rebuilds the values from $tmpUserRoles so that the array key is the primary key
$userRoles = array();
foreach ($tmpUserRoles as $roleData) {
$userRoles[$roleData['role_id']] = $roleData;
}
// This loop is used in the view. Once again, this is dumbed down
foreach ($Roles as $role) {
if (isset($userRoles[$role->role_id]) {
echo $user->firstName.' is a '.$role->label;
} else {
echo $user->firstName.' is not a '.$role->label;
}
}
循环数组只是为了创建一个以主键作为索引的相同数组,这似乎是浪费时间。在Laravel中是否有更简单的方法来通过使用对象的主键来判断对象是否包含在集合中?
答案 0 :(得分:10)
使用$tmpUserRoles->contains(5)
检查您的收藏中是否存在主键5
。
(见http://laravel.com/docs/4.2/eloquent#collections)
答案 1 :(得分:2)
所选答案看起来很有效。
如果你想要一个更易读的测试方法,如果一个对象是laravel集合类的实例(或者一般的任何类),你可以使用php is_a()
函数:
// This will return true if $user is a collection
is_a($user, "Illuminate\Database\Eloquent\Collection");
这并不是您在问题描述中也想做的事情,但一般情况下这可能会有所帮助。