数据库:集合
Introduction
模型返回的所有多结果集都是Illuminate\Database\Eloquent\Collection
对象,包括通过get
方法或通过关系访问。这Collection
对象扩展了基础集合,因此它自然继承了数十种用于流畅地处理底层模型数组的方法。
所有集合也用作迭代器,允许您像简单的 PHP 数组一样循环遍历它们:
$users = User::where('is_active', true)->get();
foreach ($users as $user) {
echo $user->name;
}
然而,集合比数组强大得多,并且使用直观的界面公开各种映射/归约操作。例如,让我们过滤所有活动模型并收集每个过滤用户的名称:
$users = User::get();
$names = $users->filter(function ($user) {
return $user->is_active === true;
})
->map(function ($user) {
return $user->name;
});
NOTE: 虽然大多数模型集合方法返回一个新的实例
Eloquent
收藏, 的pluck
,keys
,zip
,collapse
,flatten
和flip
方法返回一个基础集合实例。同样,如果一个map
操作返回一个不包含任何模型的集合,它将自动转换为基础集合。
可用方法
所有模型集合都扩展了基础集合对象;因此,它们继承了集合基类提供的所有强大方法。
除此之外Illuminate\Database\Eloquent\Collection
类提供了一个超集的方法来帮助管理您的模型集合。大多数方法返回Illuminate\Database\Eloquent\Collection
实例;然而,一些方法返回一个基数Illuminate\Support\Collection
实例。
包含($key,$operator = null,$value = null)
这contains
方法可用于确定给定模型实例是否包含在集合中。此方法接受主键或模型实例:
$users->contains(1);
$users->contains(User::find(1));
diff($items)
这diff
方法返回给定集合中不存在的所有模型:
use App\User;
$users = $users->diff(User::whereIn('id', [1, 2, 3])->get());
except($keys)
这except
方法返回所有不具有给定主键的模型:
$users = $users->except([1, 2, 3]);
find($key)
这find
方法查找具有给定主键的模型。如果$key
是一个模型实例,find
将尝试返回与主键匹配的模型。如果$key
是一个键数组,查找将返回匹配的所有模型$keys
使用whereIn()
:
$users = User::all();
$user = $users->find(1);
新鲜($with = [])
这fresh
方法从数据库中检索集合中每个模型的新实例。此外,任何指定的关系都将被预先加载:
$users = $users->fresh();
$users = $users->fresh('comments');
intersect($items)
这intersect
方法返回给定集合中也存在的所有模型:
use App\User;
$users = $users->intersect(User::whereIn('id', [1, 2, 3])->get());
load($relations)
这load
方法 eager 加载集合中所有模型的给定关系:
$users->load('comments', 'posts');
$users->load('comments.author');
loadMissing($relations)
这loadMissing
如果尚未加载关系,方法 eager 会加载集合中所有模型的给定关系:
$users->loadMissing('comments', 'posts');
$users->loadMissing('comments.author');
modelKeys()
这modelKeys
方法返回集合中所有模型的主键:
$users->modelKeys();
// [1, 2, 3, 4, 5]
makeVisible($attributes)
这makeVisible
方法使集合中每个模型上通常“隐藏”的属性可见:
$users = $users->makeVisible(['address', 'phone_number']);
makeHidden($attributes)
这makeHidden
方法隐藏通常在集合中的每个模型上“可见”的属性:
$users = $users->makeHidden(['address', 'phone_number']);
only($keys)
这only
方法返回所有具有给定主键的模型:
$users = $users->only([1, 2, 3]);
唯一($key = null,$strict = false)
这unique
方法返回集合中的所有唯一模型。删除与集合中另一个模型具有相同主键的相同类型的任何模型。
$users = $users->unique();
自定义集合
如果您需要使用自定义Collection
使用您自己的扩展方法的对象,您可以重写newCollection
模型上的方法:
class User extends Model
{
/**
* Create a new Collection instance.
*/
public function newCollection(array $models = [])
{
return new CustomCollection($models);
}
}
一旦你定义了一个newCollection
方法,只要模型返回一个,您就会收到一个自定义集合的实例Collection
实例。如果您想为插件或应用程序中的每个模型使用自定义集合,您应该重写newCollection
由所有模型扩展的模型基类上的方法。
use Winter\Storm\Database\Collection as CollectionBase;
class CustomCollection extends CollectionBase
{
}
数据馈送
数据馈送允许您将多个模型类组合到一个集合中。这对于创建提要和数据流非常有用,同时支持使用分页。它通过在准备状态之前添加模型对象来工作get
方法被调用,然后将它们组合起来形成一个行为与常规数据集相同的集合。
这DataFeed
类模仿常规模型并支持limit
和paginate
方法。
创建新提要
下一个示例将 User、Post 和 Comment 模型组合到一个集合中并返回前 10 条记录。
$feed = new Winter\Storm\Database\DataFeed;
$feed->add('user', new User);
$feed->add('post', Post::where('category_id', 7));
$feed->add('comment', function() {
$comment = new Comment;
return $comment->where('approved', true);
});
$results = $feed->limit(10)->get();
处理结果
这get
方法将返回一个Collection
包含结果的对象。记录可以通过使用区分tag_name
添加模型时设置为第一个参数的属性。
foreach ($results as $result) {
if ($result->tag_name == 'post')
echo "New Blog Post: " . $record->title;
elseif ($result->tag_name == 'comment')
echo "New Comment: " . $record->content;
elseif ($result->tag_name == 'user')
echo "New User: " . $record->name;
}
订购结果
结果可以按单个数据库列排序,可以是所有数据集使用的共享默认值,也可以单独指定add
方法。结果的方向也必须共享。
// Ordered by updated_at if it exists, otherwise created_at
$feed->add('user', new User, 'ifnull(updated_at, created_at)');
// Ordered by id
$feed->add('comments', new Comment, 'id');
// Ordered by name (specified default below)
$feed->add('posts', new Post);
// Specifies the default column and the direction
$feed->orderBy('name', 'asc')->get();