【Laravel 入門】クエリビルダを使ってデータベースにアクセスする

Laravel

「クエリビルダ」という機能を使うと、SQLクエリ文を使用せずPHPのプログラムでデータベースにアクセスすることができるようになります。

今回は、クエリビルダの使い方について解説していきます。


なお、すでに以下のような people テーブルを作成しています。


テーブル・レコードの作成方法については前回の記事をご参照ください。


参考書

DBクラスと table メソッド

DBクラスを使うことで、データベースの利用に関する様々な機能を使用することができます。

そして table メソッドを呼び出し、指定したテーブルの「ビルダ」を取得します。

$変数 = DB::table( ‘テーブル名’ );


ビルダは、Illuminate\Database\Query 名前空間にある Builder クラスで、SQLクエリ文を生成するための機能をもちます。

このビルダに用意されているメソッドを利用することで、様々な処理が行えるようになるわけですね。

レコードの取得

全レコードの取得

では実際にDBクラスと table メソッドを使ってみましょう。

コントローラに use 文を追加し、アクションを以下のように記述します。

use Illuminate\Support\Facades\DB;//追加
class SampleController extends Controller
{
    public function index(Request $request) 
    {
        $people = DB::table('people')->get();
        return view('sample.index', ['people'=>$people]);
    }
}


今回は get メソッドを呼び出し、全レコードを取得しています。
引数にフィールド名を入れると、そのフィールドだけを取り出すことができます。



そして、テンプレートには以下のように記述します。

@section('content')
    <table>
        <tr><th>id</th><th>名前</th><th>メールアドレス</th><th>年齢</th></tr>
        @foreach ($people as $person)
            <tr><td>{{$person->id}}</td><td>{{$person->name}}</td><td>{{$person->mail}}</td><td>{{$person->age}}</td></tr>
        @endforeach
    </table>
@endsection


すると、冒頭で示した画像と同じ表示になり、全レコードが取得できていることが確認できました。

指定したレコードの取得

指定したフィールドの値と一致するレコードの取得

まずは、指定したレコードを表示するためのテンプレートをつくります。

今回は、「views/sample/show.blade.php」というファイルに以下のように作成します。

@section('content')
    <table>
        <tr><th>id: </th><td>{{$person->id}}</td></tr>
        <tr><th>名前: </th><td>{{$person->name}}</td></tr>
        <tr><th>メールアドレス: </th><td>{{$person->mail}}</td></tr>
        <tr><th>年齢: </th><td>{{$person->age}}</td></tr>
    </table>
@endsection


続いてコントローラに show という名前でアクションを追加します。

public function show(Request $request) 
{   
    $id = $request->id;
    $person = DB::table('people')->where('id', $id)->first();
    return view('sample.show', ['person'=>$person]);
}


where メソッドは SQL の where に相当するものであり、
引数にフィールド名と値を入れることで、その条件に合致するレコードに絞り込みます。

where( ‘フィールド名’ , 値 );



first メソッドは、最初のレコードだけを返すものになります。

プライマリーキーで検索するときは「一つしかレコードがない」ことがわかっているので、get ではなく first を使っています。


では、ブラウザで以下のようにアクセスしてみましょう。

/sample/show?id=2


今回は「id=2」としました。ブラウザには以下のように表示されます。


「id=2」のレコードが検索できていますね!

演算記号をつかって絞り込み

以下のような形で演算記号をつかい検索することができます。

where( ‘フィールド名’ , 演算記号 , 値 );


例として id が1より大きいレコードを取得してみます。

先ほどつくった show テンプレートを以下のように修正します。

@section('content')
    <table>
        @foreach($people as $person)
            <tr><th>id: </th><td>{{$person->id}}</td><th>名前: </th><td>{{$person->name}}</td></tr>
        @endforeach
    </table>
@endsection


コントローラの show メソッドを以下のようにし、取得した id の値よりも大きい値を持つレコードを取得します。

public function show(Request $request) 
{   
    $id = $request->id;
    $people = DB::table('people')->where('id', '>', $id)->get();
    return view('sample.show', ['people'=>$people]);
}


そして、ブラウザに以下のようにアクセスします。

/sample/show?id=1

「id=1」と指定しているため、1よりも大きい値を持つレコードが取得できていることが確認できました。

複数の条件で絞り込み

where(…)->where(…)

複数の条件を設定し、すべての条件を満たすレコードだけを取得します。

where(…)->orWhere(…)

複数の条件のどれかひとつでも満たすものを取得します。

並び順の指定

レコードの並び順を変更したい場合に用いるのが orderBy メソッドになります。

orderBy( フィールド名 , ‘asc または desc’ )


asc は昇順、
desc は降順となります。


では、コントローラのメソッドを変更し、id を降順で並べ替えてみます。

public function index(Request $request) 
{
    $people = DB::table('people')->orderBy('id', 'desc')->get();
    return view('sample.index', ['people'=>$people]);
}

レコードの部分的な取り出し

レコードが大量にある場合、部分的に取り出す際に用いるのが「offset」「limit」です。

指定した位置からレコードを取得

offset( 整数 )

たとえば引数を5とすると、最初から5個分移動し、6個目からレコードを取得します。

指定した数だけレコードを取得

limit( 整数 )

たとえば引数を3とすると、3個だけレコードを取得します。



では実際に使用してみます。
今回はレコードを10個用意しておきました。

一度に表示するレコードの数を3つとし、イメージとしては
1ページ目には id が1~3のレコードを、
2ページ目には id が4~6のレコードを、
3ページ目には id が7~9のレコードを表示するという感じです。


では show メソッドを以下のようにします。

public function show(Request $request) 
{   
    $page = $request->page;
    $people = DB::table('people')
        ->offset(($page - 1) * 3)
        ->limit(3)
        ->get();
    return view('sample.show', ['people'=>$people]);
}


今回は2ページ目にアクセスしたと想定し、以下のパスでアクセスします。

/sample/show?page=2


すると、ブラウザには id が4~6のレコードが表示されます。

レコードの追加

レコードを新規追加するには以下のように insert メソッドを使います。

DB::table(…)->insert( データをまとめた配列 );


insert の引数には、フィールド名をキーとする連想配列を入れます。



では実際に使ってみましょう。
新しくコントローラのアクションとテンプレートを追加します。

まずはテンプレートを新規作成するため、「views/sample/add.blade.php」ファイルを作り、以下のように記述します。

@section('content')
    <form action="/sample/add" method="post">
        <table>
            @csrf
            <tr><th>名前:</th><td><input type="text" name="name"></td></tr>
            <tr><th>メールアドレス:</th><td><input type="text" name="mail"></td></tr>
            <tr><th>年齢:</th><td><input type="text" name="age"></td></tr>
            <tr><th></th><td><input type="submit" value="送信"></td></tr>
        </table>
    </form>
@endsection


そしてコントローラには以下のアクションを追加します。

public function add(Request $request)
{
    return view('sample.add');
}

public function create(Request $request)
{
    $person = [
        'name' => $request->name,
        'mail' => $request->mail,
        'age' => $request->age,
    ];
    DB::table('people')->insert($person);
    return redirect('/sample');
}


併せて「web.php」にルートも設定しておきます。

Route::get('/sample/add', 'App\Http\Controllers\SampleController@add');
Route::post('/sample/add', 'App\Http\Controllers\SampleController@create');


今回はレコードを10個用意しているため、新しく追加すると id=11 のレコードが生成されます。

ブラウザでの挙動↓



以下のような流れになります。

①「/sample/add」にアクセスすると add アクションが呼び出され、add テンプレートが表示される

②各フィールドを入力し送信を押すと、create メソッドが呼び出され、people テーブルに新しく追加

③「/sample」へリダイレクト

レコードの更新

レコードを更新するには以下のように update メソッドを使います。

DB::table(…)->where( 更新対象 )->update( データをまとめた配列 );


もし where で更新対象を絞り込むことを忘れてしまうと、すべてのレコードが更新されてしまうため気をつけましょう。


では実際に使ってみます。

まずはテンプレートを新規作成するため、「views/sample/edit.blade.php」ファイルを作り、以下のように記述します。

@section('content')
    <form action="/sample/edit" method="post">
        <table>
            @csrf
            <input type="hidden" name="id" value="{{$target->id}}">
            <tr><th>名前:</th><td><input type="text" name="name" value="{{$target->name}}"></td></tr>
            <tr><th>メールアドレス:</th><td><input type="text" name="mail" value="{{$target->mail}}"></td></tr>
            <tr><th>年齢:</th><td><input type="text" name="age" value="{{$target->age}}"></td></tr>
            <tr><th></th><td><input type="submit" value="送信"></td></tr>
        </table>
    </form>
@endsection


上記の中で、

<input type="hidden" name="id" value="{{$target->id}}">

を書いている理由は、
送信された情報から更新するレコードを取得しないといけないため、その id を保管するために用意しています。


そしてコントローラには以下のアクションを追加します。

public function edit(Request $request)
{   
    $target = DB::table('people')
        ->where('id', $request->id)->first();
    return view('sample.edit', ['target' => $target]);
}

public function update(Request $request)
{
    $person = [
        'name' => $request->name,
        'mail' => $request->mail,
        'age' => $request->age,
    ];
    DB::table('people')
        ->where('id', $request->id)
        ->update($person);
    return redirect('/sample');
}


併せて「web.php」にルートも設定しておきます。

Route::get('/sample/edit', 'App\Http\Controllers\SampleController@edit');
Route::post('/sample/edit', 'App\Http\Controllers\SampleController@update');



では今回は、id=3 のレコードの年齢を更新します。

ブラウザでの挙動↓


以下のような流れになります。

①「/sample/edit/?id=3」にアクセスすると edit アクションが呼び出され、id で指定したレコードが edit テンプレートに渡されて表示される

②フィールドを変更し送信を押すと、update メソッドが呼び出され、対象のレコードを更新

③「/sample」へリダイレクト

レコードの削除

レコードを削除するには以下のように delete メソッドを使います。

DB::table(…)->where( 削除対象 )->delete();


もし where で削除対象を絞り込むことを忘れてしまうと、すべてのレコードが削除されてしまうため気をつけましょう。


では実際に使ってみます。

まずはテンプレートを新規作成するため、「views/sample/del.blade.php」ファイルを作り、以下のように記述します。

@section('content')
    <form action="/sample/del" method="post">
        <table>
            @csrf
            <input type="hidden" name="id" value="{{$target->id}}">
            <tr><th>名前:</th><td>{{$target->name}}</td></tr>
            <tr><th>メールアドレス:</th><td>{{$target->mail}}</td></tr>
            <tr><th>年齢:</th><td>{{$target->age}}</td></tr>
            <tr><th></th><td><input type="submit" value="送信"></td></tr>
        </table>
    </form>
@endsection


そしてコントローラには以下のアクションを追加します。

public function del(Request $request)
{   
    $target = DB::table('people')
        ->where('id', $request->id)->first();
    return view('sample.del', ['target' => $target]);
}

public function remove(Request $request)
{
    DB::table('people')
        ->where('id', $request->id)
        ->delete();
    return redirect('/sample');
}


併せて「web.php」にルートも設定しておきます。

Route::get('/sample/del', 'App\Http\Controllers\SampleController@del');
Route::post('/sample/del', 'App\Http\Controllers\SampleController@remove');


では今回は、id=3 のレコードを削除します。

ブラウザでの挙動↓


以下のような流れになります。

①「/sample/del/?id=3」にアクセスすると del アクションが呼び出され、id で指定したレコードが delテンプレートに渡されて表示される

②送信を押すと、removeメソッドが呼び出され、対象のレコードを削除

③「/sample」へリダイレクト






今回は以上になります。
ご覧いただきありがとうございました(^^)


参考書


続きはこちら↓

コメント

コンタクトフォーム

    タイトルとURLをコピーしました