Laravel 5.4 入門系列 3. 任務列表顯示

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

查詢構造器(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, '做業',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>

參考資料:

相關文章
相關標籤/搜索