laravel

Laravel入門 Lesson 4 - DB

More than 3 years have passed since last update.

Database

Intro

今回はLaravelでDBをいじって簡単な掲示板を作る。

Lessonで使われるDBはMySQLである。

Step 0. 事前準備

LaravelでDBを操作する前にDatabaseとTableを作っておこう。

Databaseを作る。
sql
CREATE DATABASE `mylaravel`;

Tableを作る。
sql
CREATE TABLE `mylaravel`.`posts` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(30),
`body` text,
PRIMARY KEY (`id`)
);

Step 1. DB setting

設定はかなり簡単である。

Laravelのapp/config/database.phpを開いて修正する。

...
        'mysql' => array(
            'driver'    => 'mysql',
            'host'      => 'localhost',
            'database'  => 'mylaravel',
            'username'  => 'root',
            'password'  => '',
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
        ),
...

'database'には先作ったdatabaseである'mylaravel'をいれて、
username、passwordは自分のDB Serverの設定にあわせて登録する。

Step 2. 投稿機能の具現(INSERT)

まず、二つのRouteが必要である。
- 投稿Formを見せるRoute
- もらったデータを保存するRoute

では、routes.phpに次のRouteを追加しよう。

app/routes.php

// 投稿formを表示する
Route::get('posts/create', 'PostController@create');

// 実際にDBにデータを入れる
Route::post('posts', 'PostController@store');

では、二つのRouteが使っているPostControllerを作成する。

まずは、create()Methodを先に作る。

app/controllers/PostController.php

<?php

class PostController extends BaseController{
    function create(){
        return View::make('posts.create');
    }
}

見てわかるお湯に'posts.create'というViewを呼んでいる。

では、今から'posts.create'Viewも作る。

app/views/posts/create.php

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <form method="post" action="../posts">
            <label for="title">title</label><br>
            <input type="text" name="title"><br>
            <label for="body">body</label><br>
            <textarea name="body"></textarea><br>
            <button type="submit">submit</button>
        </form>
    </body>
</html>

やっと投稿Formが完成された。
まだSubmit buttonを押してもちゃんと動かないが、Formがちゃんとできているのかだけ確認して進もう。

http://localhost/mylaravel/posts/create.php

結果

lesson4-1.png

確認ができたら、またPostController.phpに戻ってstore()Methodを完成しよう。

app/controllers/PostController.php

<?php

class PostController extends BaseController{
    function create(){
        return View::make('posts.create');
    }
    function store(){
        DB::table('posts')->insert([
            'title'=>Input::get('title'),
            'body'=>Input::get('body')
        ]);
        return 'Successfully done!';
    }
}

DBにQueryを送るのはDBClassのMethodで簡単にできる。
そして、Input::get()はParameterとして入ったデータを扱うとき使うClass methodである。

これで、http://localhost/mylaravel/posts/create.php
が起動するようになった。

適当に内容を入れてSubmitしてみる。

lesson4-2.png

Step 3. 閲覧機能の具現(SELECT)

今回はすべて投稿と一つの投稿を閲覧する機能をいれる。

まず、Routeを追加する。

app/route.php

// 投稿formを表示する
Route::get('posts/create', 'PostController@create');

// 実際にDBにデータを入れる
Route::post('posts', 'PostController@store');

// すべてのPostを表示する
Route::get('posts', 'PostController@index');

// 一つのPostを表示する。
Route::get('posts/{postid}','PostController@show');

少し注目してほしいのは'posts/{postid}'という部分だ。
{postid}に何あの値が入った場合の処理で、{postid}の値をControllerから読み取ることもできる。

では、Controllerにもindex(),show()Methodを実装させる。

app/controllers/PostController.php

<?php

class PostController extends BaseController{
    function create(){
        return View::make('posts.create');
    }
    function store(){
        DB::table('posts')->insert([
            'title'=>Input::get('title'),
            'body'=>Input::get('body')
        ]);
        return 'Successfully done!';
    }
    function index(){
        $posts = DB::table('posts')->get();
        return View::make('posts.index')->with('posts', $posts);
    }
    function show($postid){
        $post = DB::table('posts')->where('id',$postid)->first();
        return View::make('posts.show')->with('post', $post);
    }
}

DBですべての目録を出すときはget()Methodで、
SQLのWHERE文が必要な場合は、先にwhere()Methodを使ってfirst()Methodを呼ぶ。

get()はすべての目録を配列で出すが、first()は一番目の項目を出す。

次はindex(),show()Methodに使われるViewを作る。

app/views/posts/index.php

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <h1>Posts list <a href="./posts/create">create a new post</a></h1>
        <ul>
            <?php foreach($posts as $post){ ?>
            <h2><a href="./posts/<?php echo $post->id?>">
                <?php echo $post->title ?></a></h2>
            <p><?php echo $post->body ?></p>
            <?php } ?>
        </ul>
    </body>
</html>

app/views/posts/show.php

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <h1><?php echo $post->title ?></h1>
        <p><?php echo $post->body ?></p>
        <a href="./">back to list</a>
    </body>
</html>

では、結果を確認する。

http://localhost/mylaravel/public/posts

lesson4-3.png

http://localhost/mylaravel/public/posts/1

lesson4-4.png

(追加) Redirecting

store()Methodが呼ばれたとき、最初はindex()Methodがなかったので、適当に文字列を返すようにしておいた。
このままじゃ、使うのが不便なので、store()が成功的に行われたらindex()にRedirectするようにしよう。

store()Methodが返す値を次のように変える。

app/controllers/PostController.php

...
    function store(){
        DB::table('posts')->insert([
            'title'=>Input::get('title'),
            'body'=>Input::get('body')
        ]);
        return Redirect::to('posts');
    }
...

これで、投稿ができたら自動的に投稿ListにRedirectするようになる。