熟悉了路由與檢視的基本操作之後,我們來讓檢視顯示一個任務列表吧。主要知識點:
-
資料遷移
-
查詢構造器
資料庫
建立資料庫
首先建立一個資料庫:
$ mysql -uroot -p
mysql> create database laratasks;
資料庫配置
Laravel 的配置檔案儲存在 config
目錄下面,例如 config/database.php
儲存了資料庫的配置資訊:
`mysql` => [
`driver` => `mysql`,
`host` => env(`DB_HOST`, `localhost`),
`database` => env(`DB_DATABASE`, `forge`),
`username` => env(`DB_USERNAME`, `forge`),
`password` => env(`DB_PASSWORD`, ``),
...
],
可以看到,有幾個變數都是先通過 env
方法獲取的,取不到的時候再使用自定義的預設值。因此通常在 .env
目錄下面根據不同的開發人員的需求來進行配置:
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
如果對該命令不熟悉,可以使用如下命令檢視具體說明:
$ php artisan help migrate
如果使用的 MySQL 版本低於 5.7,可能會報錯:
Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes
這是因為,Laravel 5.4 採用的資料庫編碼為 utf8mb4
,該編碼可以支援 emojis
表情的儲存。要解決該問題,只需要增加下面的程式碼:
// /app/Providers/AppServiceProvider.php
use IlluminateSupportFacadesSchema;
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
查詢構造器(DB)
現在,資料庫就多了 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, `作業`,CarbonCarbon::now(),CarbonCarbon::now()]);
>>> DB::insert(`insert into tasks (id, name, created_at, updated_at) values (?, ?,?,?)`, [2, `購物`,CarbonCarbon::now(),CarbonCarbon::now()]);
>>> DB::insert(`insert into tasks (id, name, created_at, updated_at) values (?, ?,?,?)`, [3, `運動`,CarbonCarbon::now(),CarbonCarbon::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>
參考資料: