熟悉了路由與視圖的基本操做以後,咱們來讓視圖顯示一個任務列表吧。主要知識點: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>
參考資料: