Laravel 5.3 collections 新特性:Partition

Author Avatar
Yish 12月 19, 2016
  • 在其他設備中閱讀本文章

在 5.3.27 中新增了一個新特性 Partition 這個方法是相當便捷的功能。

原有作法

舉例來說目前你有一個 post 有三個狀態: published, draft, pending,原本的方法可能會這樣子寫:

1
2
3
4
5
$post = Post::all();
//views
if ($post->status == 'published') ...
others...

或者你可以用 presenter 的方式做處理:

1
2
3
4
5
//inject
@inject('PostPresenter', 'App\Presenter\UserPresenter');
@if ($PostPresenter->published($post)) ...
others...

新作法

現在 laravel 5.3.27 or later 提供了 Partition:

舉例來說目前要取得 published 的文章,與其他的 draft 和 pending 作區別:

1
2
3
4
5
6
7
8
9
$posts = Post::all();
$exploded = $posts->partition(function ($post) {
return $post->status == 'PUBLISHED';
});
list($published, $others) = [$exploded[0], $exploded[1]];
return view('welcome', compact('published', 'others'));

視圖渲染

視圖部分則是這樣寫就可以了:

1
2
3
4
5
6
7
8
9
//published posts.
@foreach($published as $publish)
{{ $publish->title }}
@endforeach
//draft, pending posts.
@foreach($others as $other)
{{ $other->title }}
@endforeach

相當實用的功能,而且不需要 inject presenter,當然也可以做各種變化作區別,這樣子的好處就是一次從 db 把資料全部抓出來再透過 collection 的方式做分類,不需要再跟 db 做第二次 query。