DBクラスとは?
Laravelに用意されている、
最もシンプルなデータベースアクセス機能は「DB」クラスです。
中でも、最もシンプルなのは、SQLのクエリを直接実行するメソッドです。
DBクラスを使用
コントローラの修正
use Illuminate\Support\Facades\DB;
class HelloController extends Controller
{
public function index(Request $request) {
$items = DB::select('select * from people');
return view('hello.index',['items' => $items]);
}
}
テンプレートの修正
@section('content')
<table>
<tr><th>Name</th><th>Mail</th><th>Age</th></tr>
@foreach($items as $item)
<tr>
<td>{{$item->name}}</td>
<td>{{$item->mail}}</td>
<td>{{$item->age}}</td>
</tr>
@endforeach
</table>
@endsection
上記の記述をすることで、
「people」テーブルから参照して、レコードを表示することができる。
調べている間に、参考になりなる記事があったので記載。
DB::select
の利用
$items = DB::select('select * from people');
上記がデータベースからレコードを取り出すための処理の記述。
DB::select
は、DBクラスにある静的メソッドで、以下のように呼び出す。
$変数 = DB::select('**実行するSQL文**);
パラメータ結合の利用
パラメータ結合 とは、
文字列とパラメータ配列を組み合わせてSQL文を作成する方法です。
public function index(Request $request) {
if (isset($request->id))
{
$param = ['id' => $request->id];
$items = DB::select('select * from people where id = :id', $param);
} else {
$items = DB::select('select * from people');
}
return view('hello.index',['items' => $items]);
}
$param = ['id' => $request->id];
['id' => パラメータ]
という配列を用意します。
$items = DB::select('select * from people where id = :id', $param);
where id = :id
の:id
はパラメータの値をはめ込むプレースホルダを指します。
DB::insert
によるレコード作成
レコード追加用のテンプレートページを作成。
@extends('layouts.helloapp')
@section('title','Add')
@section('menubar')
@parent
新規作成ページ
@endsection
@section('content')
<form action="/hello/add" method="post">
<table>
@csrf
<tr><th>name: </th><td><input type="text" name="name"></td></tr>
<tr><th>mail: </th><td><input type="text" name="mail"></td></tr>
<tr><th>age: </th><td><input type="text" name="age"></td></tr>
<tr><th></th><td><input type="submit" name="send"></td></tr>
</table>
</form>
@endsection
@section('footer')
copyright 2020 tuyano.
@endsection
コントローラへレコード追加処理の追加
class HelloController extends Controller
{
public function index(Request $request) {
$items = DB::select('select * from people');
return view('hello.index',['items' => $items]);
}
public function post(Request $request) {
$items = DB::select('select * from people');
return view('hello.index',['items' => $items]);
}
public function add(Request $request) {
return view('hello.add');
}
public function create(Request $request) {
$param = [
'name' => $request->name,
'mail' => $request->mail,
'age' => $request->age,
];
DB::insert('insert into people (name, mail, age) values (:name, :mail, :age)', $param);
return redirect('/hello');
}
}
ルート情報の追加
addページにルーティングするように、「web.php」に登録する。
Route::get('hello/add','App\Http\Controllers\HelloController@add');
Route::post('hello/add','App\Http\Controllers\HelloController@create');
DB::update
による更新
更新用テンプレートページの作成
@extends('layouts.helloapp')
@section('title','Edit')
@section('menubar')
@parent
更新ページ
@endsection
@section('content')
<form action="/hello/edit" method="post">
<table>
@csrf
<input type="hidden" name="id" value="{{$form->id}}">
<tr><th>name: </th><td><input type="text" name="name" value="{{$form->name}}"></td></tr>
<tr><th>mail: </th><td><input type="text" name="mail" value="{{$form->mail}}"></td></tr>
<tr><th>age: </th><td><input type="text" name="age" value="{{$form->age}}"></td></tr>
<tr><th></th><td><input type="submit" name="send"></td></tr>
</table>
</form>
@endsection
@section('footer')
copyright 2020 tuyano.
@endsection
フォームのvalue
に$form
の値を設定することで、
$form
に更新するレコードの値を設定しておけばその値が表示されるようになります。
またレコードを更新する際に、どのレコードを更新するのか判断するための、
<input type="hidden" name="id" value="{{$form->id}}">
で
$form
に「id」を持たせ、どのレコードを更新するのかを判断できるようにしています。
更新処理の追加
public function edit(Request $request) {
$param = ['id' => $request->id];
$item = DB::select('select * from people where id =:id', $param);
return view('hello.edit',['form' => $item[0]]);
}
public function update(Request $request) {
$param = [
'id' => $request->id,
'name' => $request->name,
'mail' => $request->mail,
'age' => $request->age,
];
DB::update('update people set name=:name, mail=:mail, age=:age where id =:id', $param);
return redirect('/hello');
}
ルーティング情報の登録
Route::get('hello/edit','App\Http\Controllers\HelloController@edit');
Route::post('hello/edit','App\Http\Controllers\HelloController@update');
DB::delete
による削除
削除用のテンプレートページを作成。
@extends('layouts.helloapp')
@section('title','Edit')
@section('menubar')
@parent
削除ページ
@endsection
@section('content')
<form action="/hello/del" method="post">
<table>
@csrf
<input type="hidden" name="id" value="{{$form->id}}">
<tr><th>name: </th><td>{{$form->name}}</td></tr>
<tr><th>mail: </th><td>{{$form->mail}}</td></tr>
<tr><th>age: </th><td>{{$form->age}}</td></tr>
<tr><th></th><td><input type="submit" name="send"></td></tr>
</table>
</form>
@endsection
@section('footer')
copyright 2020 tuyano.
@endsection
削除処理をコントローラに追加する
public function del(Request $request) {
$param = ['id' => $request->id];
$item = DB::select('select * from people where id =:id', $param);
return view('hello.del',['form' => $item[0]]);
}
public function remove(Request $request) {
$param = ['id' => $request->id];
DB::delete('delete from people where id =:id', $param);
return redirect('/hello');
}
ルーティング情報を追加する
Route::get('hello/del','App\Http\Controllers\HelloController@del');
Route::post('hello/del','App\Http\Controllers\HelloController@remove');
これで、でーたベース操作の基本である「CRUD」の実装はできましたが、
コントローラにSQLクエリ文をそのまま記述しただけのやり方であまりスマートではない。
次回、クエリビルダを利用するとよりPHPらしい記述でDB操作ができる。