icon
Let's create! WordPressサイト制作とメンテ/エラー対応から、PHP/CSS/javascriptプログラミング、動画・音・イラスト等制作まで扱うコラム

【PHPフレームワークLaravel】DBクラスを使って、SQLiteデータベースのCRUD操作(Create、Read、Update、Delete)をやってみる

更新: 2024/08/23 5480文字

今回はPHPフレームワークLaravelで、データベースの操作を行ってみたいと思います。DBクラス・クエリビルダ・Eloquentのうち、sql的にイメージがわかりやすいDBクラスを用いてみます。早速かくにんしていきましょうか。

*注:管理人はLaravel v10.7.1 (PHP v8.1.6)環境で行いました。またlocalなので、ネット上で操作できるサンプルはありません。

今回の参考書籍~PHPフレームワーク Laravel入門 第2版(秀和システム)

LaravelにはDBクラス・クエリビルダ・Eloquentといったデータベース操作機能が複数あります。管理人は正直ネットで検索してもわからなかったので(笑)、本屋で適当に買ったプログラミングの書籍で調査することにしました。

それがこの『PHPフレームワーク Laravel入門第2版(秀和システム)』です。今回はこの本のコードを参考に、当サイトで端折ってわかりやすくできればと思います(わからなかったら、用語を検索してしらべるか、本を読んでみてください)。

下準備1~SQliteデータベース準備

SQliteデータベースを準備します。コマンドで入れたりする方法もありますが、(本にもあったので)DB Browser for SQLiteというソフトウェアを使ってみました。まずはLaravelインストールディレクトリ内の『database/sqlite(作ったフォルダ)』にデータベースを作成。

そして、CREATE TABLE文を実行してテーブルを作ります。SQLは以下のような感じで。なお、他のテーブルが入ってごちゃごちゃしているのは、マイグレーションやっちゃったからです。

CREATE TABLE "people" (
 "id" INTEGER,
 "name" TEXT NOT NULL,
 "mail" TEXT,
 "age" INTEGER,
 PRIMARY KEY("id" AUTOINCREMENT)
)

次に、以下のようなinsert文でダミーレコード入れていきました。Laravelに慣れている方はseederを使いますが、管理人は普通にSQLで入れてしまいました。

insert into "people" values(1,"taro","taro@example.com",32);

データが入るとこんな感じに。このデータをLaravel上で扱っていきます。

下準備2~SQlite接続のため、envファイル(DB_CONNECTION)・config/Database.phpを編集

下準備2はデータベースの接続設定です。まずはLaravelインストールディレクトリ直下のenvファイル。たぶんDB_CONNECTIONがmysqlになっていると思うので、これをsqliteに変えます。DB_DATABASEを#つけてコメントアウトしていますが、Database.phpでパスきちんと指定したら、これ無しでも動きました。

次にconfig/Database.phpも編集。ここは2か所変更しました。
まずは『'default' => env('DB_CONNECTION', 'sqlite'),』に。

そしてその下の方にあるconnections=>sqlite内のdatabase。
『'database' => database_path('/sqlite/database.sqlite'),』に変更。こっちもデフォルト状態はmysqlになってるみたいですね。

データベース操作用コントローラー追加・ルーティング・ビューの準備

artisanコマンドでデータベース操作用コントローラーを作ろう

LaravelといったらMVCフレームワークです。Cのコントローラー部分を用意しましょう。すでにLaravelが入っているので、artisanコマンドを使ってコントローラーを用意します(Laravel用のコマンドです)。名前はSQLiteから頭3文字とって、SqlControllerにしましょうか。以下のコマンドを打ちました(cdで、laravel入れたディレクトリ指定しています)。

cd /xampp/htdocs/laravel/
php artisan make:controller SqlController

『SqlController』が、Laravelディレクトリ/app/Http/Controllers内に作成されました。ただしこの段階では『class SqlController extends Controller』みたいなのが書いてあって、他はまっさらな状態です。あとからここにメソッドを書いていきます。

ルーティング(/routes/web.php)

ルーティングのファイルを作る前に、『どのurl/パラメータで何を表示するか/どういう機能を持たせるか』を整理しておくとよいかなと思います。今回のデータベース操作で、以下のような構成を考えました。これは後ほど作るviewのbladeファイルにも関わります。

一覧表示 http://localhost/laravel/public/dbtest01/
データ追加 http://localhost/laravel/public/dbtest01/add
データの更新 http://localhost/laravel/public/dbtest01/edit?id=〇〇
データの削除 http://localhost/laravel/public/dbtest01/del?id=〇〇

そして、『laravelインストールディレクトリ/routes』内のweb.phpにルーティングを書いていきます。ごちゃごちゃするので別ファイルにまとめて、requireで読み込みました。

『Route::post()』のようになっているものがいくつかあります。取得するときはRoute::getと書いて(GETメソッド)、add/edit/deleteのときはPOSTメソッドを使うのでRoute::postを書きます。変数の$cDbTest01は、パスの共通部分を使いまわしているだけです。

ビューのファイルを用意しておく(/resources/views)

表示用に使うビューのファイルも準備しておきましょうか。ビューは『インストールディレクトリ/resources/views』となっており、いろんなアプリつくってたので、今回のsqlite操作用として『dbtest01』フォルダを用意。

『インストールディレクトリ/resources/views/dbtest01』内に、add・edit・del・indexに対応するbladeファイルを用意しました。これは後から中身を書いていきます。

DBクラスを使ったSqlController.php(コントローラー)記載例

上の方に『use Illuminate\Support\Facades\DB;』というのを追加しました。これでロードしておかないと、『DBクラスが見つかりません』のようなエラーになります。そのほかメソッドは以下の通りです。

index(一覧)時の挙動

return viewは一覧ページ(index)を表示。DB::selectは中にsqlのセレクト文を書いて取得します。$Request->idがあるかどうかで分岐し、id指定がある場合は、そのidのユーザーを表示します。

add(データ追加)時

return viewでの表示はaddページ。ここではフォーム$Requestからname,mail,ageの3つを受け取ります。あとはDB::insertにこのパラメータを渡して、insert文を実行。これもsql文が見えてるので、イメージ的にわかりやすいかも。

edit(データの編集)時

編集するときは、まずパラメータidがあるか判定。ある場合はそのid指定でDB::selectを実行し取得。ここまでは表示段階。フォーム送信したあとは、$Requestからid,name,mail,ageの4つを受け取り、DB::updateでupdate文を実行してトップにリダイレクト、という流れです。

del(データの削除)時

パラメータidがあるか判定してid指定でDB::selectを実行までは一緒で、そのあとDB::deleteでdelete文実行。edit、delとかは、フロントのjavascriptで実行前アラート出してもよいですね。

ビューファイル(〇〇.blade.php)

ビューファイルは4つあるんですけど、共通部分をのぞいて、上記のgithub.gistにまとめました。indexの場合は表が出てきて、他の場合はフォームが出ます。form actionの送信先は、それぞれadd,edit,delとなっています。

また、csrf_fieldというのは、laravelでつかわれるトークンのチェックです。不正遷移やCSRF対策などに使われているようですね。

表示・操作例(ローカル)

では、さっそくxammpをオンにして、確認してみましょうか。まずは一覧ページ。 現在sqlite,peopleテーブルに登録されているメンバーのid,名前,メルアド,年齢が表示されました。

一覧でurlパラメータにidが指定された場合は・・・ 絞り込むことができます。

上のピンク色のメニュー部分にデータ追加をつけときました。追加してみましょう。 メンバーに『Doris』を追加します。

一覧にリダイレクトされた後、入力したメンバーが追加されているのが確認できました。

次は、既存メンバー情報を編集してみます。 id1番のtaroの年齢が32になっていましたが、これを45に変更します。

ok、変更されましたね。

最後に、既存データの削除を行ってみます。 表の右端に、データ削除リンクをつけておきました。該当のidのレコードを削除します。例えば、id10,mazzi氏の削除リンクはこれ。

移動した場合、確認画面。ここではまだidを取得して表示している段階。(間違ってフォームにしてしまいました。表が良いです。)

ボタンを押すとトップにリダイレクトされますが、その間にdeleteが実行されて、該当データがなくなりました。

あとがき・まとめ

  • laravelでデータベースを扱うときは、envファイルやconfig/Database.phpで接続できるように設定する
  • ルーティング・ビュー・コントローラーはいつも通りだが、フォーム送信を伴うため、該当のページでRoute::postを使う
  • DBクラス利用時、Illuminate\Support\Facades\DBをロードしないと『見つかりません』エラーになる
  • DBクラスで、対応メソッドにパラメータを渡して、SQL文を直接実行できる

まとめると、こんなところでしょうか。サクッと書いた割にはながくなりましたが、最低限のデータベース操作はできたかと思います。このほかlaravelには、クエリビルダ(DB::table(〇〇)->get()みたいなやつ)やEloquentとかもあるので、管理人も調査してみます。


【カテゴリ】- PHP
【タグ】- ,

関連記事