一、下载 laravel 5.4
composer create-project laravel/laravel=5.4.* laravel5.4_collection
新建数据库 laravel5.4_collection
修改 .evn 配置文件
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel5.4_collection
DB_USERNAME=laravel5.4_collection
DB_PASSWORD=laravel5.4_collection
修改中国时区,在 config/app.php 中修改
'timezone' => 'PRC',
切换目录
cd laravel5.4_collection
二、创建数据
创建 post model
php artisan make:model Post -m
修改迁移文件:posts_table.php
public function up()
{
Schema::create('posts', function (Blueprint $table) {
$table->increments('id');
$table->string('title');
$table->boolean('published')->default(1);
$table->text('content');
$table->timestamps();
});
}
修改 database/factories/ModelFactory.php
$factory->define(App\Post::class, function (Faker\Generator $faker) {
return [
'title' => $faker->sentence,
'content' => $faker->paragraph,
];
});
执行数据迁移
php artisan migrate
如果报错
Specified key was too long; max key length is 1000 bytes
问题分析:Laravel 5.4 默认使用 utf8mb4 字符编码,而不是之前的 utf8 编码。因此运行 php artisan migrate 会出现以上错误。MySql 支持的 utf8 编码最大字符长度为 3 字节,如果遇到 4 字节的宽字符就会出现插入异常。三个字节 UTF-8 最大能编码的 Unicode 字符是 0xffff,即 Unicode 中的基本多文种平面(BMP)。因而包括Emoji 表情(Emoji 是一种特殊的 Unicode 编码)在内的非基本多文种平面的 Unicode 字符都无法使用 MySql 的 utf8 字符集存储。这也应该就是 Laravel 5.4 改用 4 字节长度的 utf8mb4 字符编码的原因之一。不过要注意的是,只有 MySql 5.5.3 版本以后才开始支持 utf8mb4字符编码(查看版本:selection version();)。如果MySql版本过低,需要进行版本更新。
问题解决:在 AppServiceProvider 中调用 Schema::defaultStringLength 方法来实现配置:
use Illuminate\Support\Facades\Schema;
public function boot()
{
Schema::defaultStringLength(191);
}
进入 tinker
php artisan tinker
创建文章数据
factory('App\Post', 5)->create();
三、Higher Order Messages
官方文档:https://laravel.com/docs/5.4/collections#higher-order-messages
Higher Order Messages 提供了一些方法使得我们更加便捷操作 collection
average, avg, contains, each, every, filter, first,
flatMap, map, partition, reject, sortBy, sortByDesc, sum
启动 serve
php artisan serve
修改 app/Post.php
protected $fillable = [
'title', 'published', 'content',
];
public function archive()
{
return $this->update(['published' => 0]);
}
修改 routes/web.php
Route::get('/', function () {
$posts = \App\Post::all();
return $posts->each->archive();
});
laravel 5.4 之前的写法
Route::get('/', function () {
$posts = \App\Post::all();
return $posts->each(function($post){
return $post->archive();
});
});
可以看到 published 变成 0
获取 title
Route::get('/', function () {
$posts = \App\Post::all();
return $posts->map->title;
});
laravel 5.4 之前的写法
Route::get('/', function () {
$posts = \App\Post::all();
return $posts->map(function($post){
return $post->title;
});
});
laravel 5.4 之前另外的一种写法
Route::get('/', function () {
$posts = \App\Post::all();
return $posts->pluck('title');
});