laravel5.4-第3章-collection laravel5.4-第3章-collection

2023-06-30

一、下载 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

访问 http://127.0.0.1:8000

https://file.lulublog.cn/images/3/2023/06/FhO4Oma8A6e780zxlouGGs44WLl0lW.jpg

修改 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();
   });
});

再次访问 http://127.0.0.1:8000

https://file.lulublog.cn/images/3/2023/06/gzU42N32322oH9naU15i6aj652oE9n.png

可以看到 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');
});

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开微信扫一扫,即可进行扫码打赏哦

阅读 222