熟悉了路由与视图的基本操做以后,咱们来让视图显示一个任务列表吧。主要知识点:php
数据迁移html
查询构造器mysql
首先建立一个数据库:laravel
$ mysql -uroot -p mysql> create database laratasks;
Laravel 的配置文件保存在 config
目录下面,例如 config/database.php
保存了数据库的配置信息:web
'mysql' => [ 'driver' => 'mysql', 'host' => env('DB_HOST', 'localhost'), 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), ... ],
能够看到,有几个变量都是先经过 env
方法获取的,取不到的时候再使用自定义的默认值。所以一般在 .env
目录下面根据不一样的开发人员的需求来进行配置:sql
DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=laratasks DB_USERNAME=root DB_PASSWORD=
配置完数据库以后,天然想到的是如何建立和操做表?Laravel 是经过迁移来实现对表的各项操做的。而 Laravel 默认就自带了两个迁移。咱们能够经过执行迁移来判断数据库是否连上:数据库
$ php artisan migrate
若是对该命令不熟悉,可使用以下命令查看具体说明:json
$ php artisan help migrate
若是使用的 MySQL 版本低于 5.7,可能会报错:app
Syntax error or access violation: 1071 Specified key was too long; max key length is 767 byteside
这是由于,Laravel 5.4 采用的数据库编码为 utf8mb4
,该编码能够支持 emojis
表情的保存。要解决该问题,只须要增长下面的代码:
// /app/Providers/AppServiceProvider.php use Illuminate\Support\Facades\Schema; public function boot() { Schema::defaultStringLength(191); }
解决了该问题以后,咱们须要手动先删除数据库中的表再从新执行迁移:
$ php artisan migrate
若迁移执行成功,数据库默认会建立三张表:
mysql> use laratasks; Database changed mysql> show tables; +---------------------+ | Tables_in_laratasks | +---------------------+ | migrations | | password_resets | | users | +---------------------+ 3 rows in set (0.00 sec)
其中 migrations
是用来记录迁移信息的,其他两张则是自带的两个迁移任务生成的表。
如今,咱们就能够建立一个用来生成任务表的迁移了。首先是建立迁移:
$ php artisan make:migration create_tasks_table --create=tasks Created Migration: 2017_04_10_175246_create_tasks_table
--create=tasks
表明了要建立数据表 tasks
,这样迁移文件会预先定义好一些内容。打开迁移表,添加几个字段:
// /database/migrations/日期_create_tasks_table.php public function up() { Schema::create('tasks', function (Blueprint $table) { $table->increments('id'); $table->text('name'); $table->timestamps(); }); }
当咱们执行迁移时,就会调用 up
方法,咱们来执行下刚才建立的迁移:
$ php artisan migrate Migrating: 2017_04_10_175246_create_tasks_table Migrated: 2017_04_10_175246_create_tasks_table
如今,数据库就多了 tasks
表格了,咱们经过 tinker
来添加数据吧:
$ php artisan tinker Psy Shell v0.8.3 (PHP 5.6.22 — cli) by Justin Hileman
首先,使用 DB
插入几条数据:
>>>> DB::insert('insert into tasks (id, name, created_at, updated_at) values (?, ?,?,?)', [1, '做业',Carbon\Carbon::now(),Carbon\Carbon::now()]); >>> DB::insert('insert into tasks (id, name, created_at, updated_at) values (?, ?,?,?)', [2, '购物',Carbon\Carbon::now(),Carbon\Carbon::now()]); >>> DB::insert('insert into tasks (id, name, created_at, updated_at) values (?, ?,?,?)', [3, '运动',Carbon\Carbon::now(),Carbon\Carbon::now()]);
再练习下 DB
的其余功能:
>>> DB::table('tasks')->get(); # 获取全部表数据 >>> DB::table('tasks')->get()->toArray(); # 将获取的数据转化为数据 >>> DB::table('tasks')->first(); # 获取第一条数据 >>> DB::table('tasks')->where('name','购物')->first(); # 指定条件 >>> DB::table('tasks')->pluck('name'); # 获取姓名列表
接下来,咱们就可让网站显示任务列表了,例如:
Route::get('tasks', function() { return $tasks = DB::table('tasks')->latest()->get(); });
访问网站的 /tasks
路径,就能够看到返回了任务列表的 json 形式。不过咱们仍是用视图展示吧:
// /routes/web.php Route::get('tasks', function() { $tasks = DB::table('tasks')->latest()->get(); return view('tasks.index',compact('tasks')); });
tasks.index
其实就至关于 tasks/index
,接下来建立视图:
// /resources/views/tasks/index.blade.php <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> {{ $tasks }} </body> </html>
访问 /tasks
,直接返回了一堆任务列表,界面显示很不友好,咱们能够用 PHP 的 foreach
循环来友好的显示任务列表:
// /resources/views/tasks/index.blade.php <h1>任务列表</h1> <ul> <?php foreach($tasks as $task): ?> <li><?php echo $task->name ?></li> <?php endforeach; ?> </ul>
一样,Laravel 的 Blade 模板提供了更为简洁的语法:
// /resources/views/tasks/index.blade.php <h1>任务列表</h1> <ul> @foreach ($tasks as $task) <li>{{ $task->name }}</li> @endforeach </ul>
接下来是显示具体的某个任务。首先是路由:
// /routes/web.php Route::get('tasks/{task}', function($id) { $task = DB::table('tasks')->find($id); return view('tasks/show',compact('task')); });
{task}
至关于占位符,好比用户访问 tasks/1
,函数接收的 $id
就为 1。
// /resources/views/tasks/show.blade.php <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> {{ $task->name }} </body> </html>
最后,咱们建立超连接让任务列表可跳转到具体任务吧:
<h1>任务列表</h1> <ul> @foreach ($tasks as $task) <li> <a href="/tasks/{{ $task->id }}">{{ $task->name }}</a> </li> @endforeach </ul>
超连接咱们也能够经过 url
函数生成:
<a href="{{ url("tasks",[$task->id]) }}">{{ $task->name }}</a>
参考资料: