のぐそんブログ

暗いおじさんがシコシコ書くブログです。

LaravelでDBを利用するメモ

LaravelからDBを利用してみます。 DBはSQLliteを利用して準備します。

/config/database.phpを変更

Laravelで利用するDBの設定情報は、/config/database.phpにあります。

<?php

...省略...

return [

    'default' => env('DB_CONNECTION', 'mysql'),

    'connections' => [

        'sqlite' => [
            ...省略...
        ],

        'mysql' => [
            ...省略...
        ],

        'pgsql' => [
            ...省略...
        ],

        'sqlsrv' => [
            ...省略...
        ],

    ],
    
    ...省略...

今回は特に設定を変更しなくても大丈夫です。

.envの変更

.envファイルのDB_CONNECTION以外をコメントアウトします。

DB_CONNECTION=sqlite
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret

こんな感じになります。

DB_CONNECTION=sqlite
#DB_HOST=127.0.0.1
#DB_PORT=3306
#DB_DATABASE=homestead
#DB_USERNAME=homestead
#DB_PASSWORD=secret

DBを利用してみる

DBクラスを利用してDBにアクセスしてみます。
DBはSQLliteで用意したものを利用しています。

コントローラーはこんな感じ。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;


class UsersController extends Controller
{
    public function index(Request $request)
    {
       $items = DB::select('select * from users');
       return view('users.index',['items' => $items]);
    }
}

users/index.blade.phpはこんな感じ。

@foreach($items as $item)
    <p>{{$item->name}} / {{$item->mail}} / {{$item->age}}</p>
@endforeach

表示はこんな感じ。

sato / sato@sample.com / 30
kato / kato@samole.com / 35

パラメータ結合

sql文にパラメーターを組み合わせて利用できる機能です。

    public function index(Request $request)
    {
        if(isset($request->id)){
            $param = ['id' => $request->id];
            $items = DB::select('select * from users where id = :id',$param);
        }else{
            $items = DB::select('select * from users');
        }

       return view('users.index',['items' => $items]);
    }

?id=1などクエリ付きでアクセスした場合に:idでクエリをSQL文に連結してくれます。

DBクラスでレコードを追加

レコードを追加する場合はDB::insertを利用します。

DB::insert(SQL文,追加する値の配列);

controllerにpostメソッドを追加します。

    public function post(Request $request)
    {
        $param = [
            'name' => $request->name,
            'mail' => $request->mail,
            'age' => $request->age
        ];

        DB::insert('insert into users (name,mail,age) values (:name,:mail,:age)', $param);
        $items = DB::select('select * from users');

        return view('users.index', ['items' =>  $items]);
    }

users/index.blade.phpはこんな感じ。

<form action="/users" method="post">
    {{csrf_field()}}
<div><span style="width: 150px; display: inline-block">名前</span><input type="text" name="name"></div>
<div><span style="width: 150px; display: inline-block">メールアドレス</span><input type="email" name="mail"></div>
<div><span style="width: 150px; display: inline-block">年齢</span><input type="number" name="age"></div>

<input style="margin-top: 20px" type="submit" value="送信">

</form>
@foreach($items as $item)
    <p>{{$item->name}} / {{$item->mail}} / {{$item->age}}</p>
@endforeach

formに値を入れてpostするとこんな感じ。

postした値がDBに挿入される。

DBクラスでレコードを更新

レコードを更新する場合はDB::updateを利用します。

DB::update(SQL文, 更新する値の配列);

controllerはこんな感じ。

    public function post(Request $request)
    {
        $param = [
            'id' => $request->id,
            'name' => $request->name,
            'mail' => $request->mail,
            'age' => $request->age
        ];

        DB::update('update users set name=:name,mail=:mail,age=:age where id = :id', $param);
        $items = DB::select('select * from users');

        return view('hello.index', ['items' => $items]);
    }

users/index.blade.phpは雑なのですがこんな感じで。

@foreach($items as $item)
<form action="/hello" method="post">
    {{csrf_field()}}
<input type="hidden" name="id" value="{{$item->id}}">
<div><span style="width: 150px; display: inline-block">名前</span><input type="text" name="name" value="{{$item->name}}"></div>
<div><span style="width: 150px; display: inline-block">メールアドレス</span><input type="email" name="mail" value="{{$item->mail}}"></div>
<div><span style="width: 150px; display: inline-block">年齢</span><input type="number" name="age" value="{{$item->age}}"></div>

<input style="margin-top: 20px" type="submit" value="送信">

</form>
@endforeach
@foreach($items as $item)
    <p>{{$item->name}} / {{$item->mail}} / {{$item->age}}</p>
@endforeach

これの「名前:sato」を

「名前:佐藤」に変更してpostする

postした値でDBが更新される。

DBクラスでレコードを削除

レコードを更新する場合はDB::deleteを利用します。

 DB::delte(SQL文, 更新する値の配列);

controllerはこんな感じ。

    public function post(Request $request)
    {
        $param = [
            'id' => $request->id
        ];

        DB::delete('delete from users where id = :id', $param);
        $items = DB::select('select * from users');

        return view('hello.index', ['items' => $items]);
    }

users/index.blade.phpは雑なのですがこんな感じで。

@foreach($items as $item)
<form action="/hello" method="post">
    {{csrf_field()}}
    <input type="hidden" name="id" value="{{$item->id}}">
<div><span style="width: 150px; display: inline-block">名前</span><input type="text" name="name" value="{{$item->name}}"></div>
<div><span style="width: 150px; display: inline-block">メールアドレス</span><input type="email" name="mail" value="{{$item->mail}}"></div>
<div><span style="width: 150px; display: inline-block">年齢</span><input type="number" name="age" value="{{$item->age}}"></div>

<input style="margin-top: 20px" type="submit" value="削除">

</form>
@endforeach
@foreach($items as $item)
    <p>{{$item->name}} / {{$item->mail}} / {{$item->age}}</p>
@endforeach

これのsatoを削除すると、

DBから削除される。