[Laravel] 建立第一個migration並從資料庫取得資料

我們學過兩件事情,從controller把資料送給view
和資料庫進行migration,現在我們要把兩件事情組在一起

一開始我們進行

php artisan make:migration {file_name} --create={tableName}

可以產生一個新的migration檔案
修改檔案後就可以執行 migrate 來建立資料表
若是執行後發現需要修改,有另一個語法

php artisan migrate:refresh

執行後把過去所有migrate動作還原(rollback),並且重新執行一遍
資料新增好之後,我們要讓Laravel取得資料庫的資料

使用

$tasks = DB::table('tasks')->get();
這個 DB query 語句可以取得 tasks 資料表中的資料,並且定義給 $tasks 當作變數
這時候如果直接 return $tasks 並且重整網頁
會發現頁面上變成資料庫中的資料了!
在Laravel中,直接return DB query語句就有這種效果
如此可以簡單的判斷資料來源有沒有問題

接下來,如果網址帶有參數例如
http://localhost:8000/tasks/2
這種情境下我們可以將controller設為

Route::get('/tasks/{task}', function ($id) {

    dd($id);

});

可以看到在get後面加了一個參數,而傳入的參數我們定義成 $id
dd 是 Laravel 的特殊用法,代表Dump & Die
如我們的範例,我們會在畫面上印出 "2"

再來我們試著不要把全部資料拉出來,只找特定資料
Route::get('/tasks/{task}', function ($id) {

    $tasks = DB::table('tasks')->find($id);
    dd ($tasks);
});

如此我們就取得網址列上傳來的參數作資料表 id 所取得的資料結果

接下來在view內新建一個資料夾tasks,並加入兩個blade模板檔案
分別是 index.blade.php和 show.blade.php

長得像這樣
<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">

        <title>index.blade</title>
    </head>
    <body>
        <ul>
            @foreach($tasks as $task)
                <li>
                    <a href="/tasks/{{ $task->id }}">
                        {{  $task->body }}
                    </a>
                </li>

            @endforeach        </ul>
    </body>
</html>

和這樣

<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">

        <title>show.blade</title>
    </head>
    <body>

        <h1>{{ $task->body }}</h1>

    </body>
</html>

這兩個頁面分別是,顯示單一和顯示全部
可以看到 index.blade 中我們還做了超連結

至於 controller 的設定
就是分別為 /task 和 /task/{task} 設定路由,如果沒有參數就走第一個
一個把全部資料送進去,另一個只抓取參數作為篩選條件

Route::get('/tasks', function () {

    $tasks = DB::table('tasks')->latest()->get();
    return view('tasks.index')
        ->with('tasks', $tasks);
});

Route::get('/tasks/{task}', function ($id) {

    $task = DB::table('tasks')->find($id);
    return view('tasks.show', compact('task'));
});

這就是 Laravel 從資料庫傳送資料到 controller 再到 view 用 foreach 顯示在畫面上


留言