#接続設定
Laravelでデータベースを使うために接続情報をLaravelプロジェクトディレクトリの直下にある.env
ファイルに適切に書きます。
今回は、MySQLを使いますので、事前のMySQLを起動しておく必要があります。
・・(一部抜粋)・・
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=?????
DB_USERNAME=?????
DB_PASSWORD=?????
なお、これらの環境変数はconfig/database.php
ファイルの env()
の箇所で使われます。ですので、config/database.php
の方はデフォルトのままでいいです。
#モデルとマイグレーション
DBを扱うクラスをモデルクラスと言います。基本的にテーブル1つに対し1つのモデルクラスを作ります。
モデルクラスはコマンドで雛形を作成します。
今回は商品を扱うので、Itemという名前にしました。
php artisan make:model Item
すると次のようにphpファイルが出来上がります。
app/Item.php
マイグレーション(DBテーブルの用意)も行っておきます。
php artisan make:migration Item
出来上がった
database/migrations/YYYY_MM_DD_HHMMSS_item.php
のなかに必要なテーブル定義を書きます。
class Item extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
//
Schema::create('items', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->string('price');
$table->string('url');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
//
Schema::drop('items');
}
}
up()はマイグレーション実行時に行うことを、down()はマイグレーション取り消し時に行うことを書きます。
ここではup()でテーブル作成、down()でテーブル削除をします。
作るテーブルの名称は商品を複数扱うので、itemsにしました。フィールドの定義はID(キー)と必要と思われる商品属性:名称(name)、価格(price)、URL(url)、タイムスタンプ です。
マイグレーション実行します。
php artisan migrate
#初期データ投入
初期データを投入したい時はLaravelのSeeder(シーダ)という機能を使います。次のコマンドでシーダクラスを作ります。この例ではItemTableSeeder
という名前を指定しています。
php artisan make:seeder ItemTableSeeder
database/seeds
に指定のシーダクラスが作られます。入れたい初期データをハッシュの配列として作成しinsertするようにコードを書きます。
class ItemTableSeeder extends Seeder
{
public function run()
{
$datas = [
['name' => 'コカコーラ', 'price' => 110, 'url' => ''],
['name' => 'ポテトチップス', 'price' => 135, 'url' => ''],
['name' => 'チョコレート', 'price' => 120, 'url' => ''],
];
DB::table('items')->insert($datas);
}
}
次のように実行します。
php artisan db:seed --class=ItemTableSeeder
--class
指定をなくすと全てのシーダクラスの実行となります。
また、マイグレーションから初期データを投入したいときは、次のコマンドでデータベースを完全に作成し直します。
php artisan migrate:refresh --seeddescription
#モデルクラスを使う
上で作ったモデルクラスItemを利用して、データベースにアクセスをしてみましょう。
ここでは商品を扱うモデルなので、その上位のItemコントローラーを事前に用意しそのアクションとしてgetListメソッドを持っておきます。getListからこのモデルのitemsテーブルに対する取得メソッドを呼ぶのです。
使用するビューテンプレートも次のものを参考にしてください。
ItemControllerコントローラーを作ります。
php artisan make:controller ItemController
コントローラーにメソッドを用意します。
<?php
namespace App\Http\Controllers;
use App\Item;//モデルの指定
//use Illuminate\Support\Facades\DB;
use Illuminate\Http\Request;
class ItemController extends Controller
{
//
public function getList(Request $request)
{
$data = Item::all();
// 条件で絞り込む時はクエリビルダで
// $data = Item::where('id', '>', 10)->get();
// これでも同じ
// $data = DB::table('items')->where('id', '>', 10)->where('price',100)->get();
return view('item.list', ['data' => $data]);
// そのまま値をreturnするとJSONになります。
// return $data;
}
}
ビューへは$dataという変数で、Item::all()
で取得したテーブル内容をそのまま渡しています。ちなみにテーブルへの挿入処理は次のようなコードになります。
public function insert()
{
$item = new Item();
$item->name = "テスト";
$item->price = 100;
$item->url = "";
$item->save();
}
ルーティング情報はコントローラークラス@メソッドを定義します。
Route::get('/list','ItemController@getList');
View(Blade)の配置場所
mkdir resources/views/item
ビューではコントローラーから受け取る結果を表示します。
<html>
<head>
<title>とりあえずDBアクセス</title>
</head>
<body>
<h1>とりあえずDBアクセス</h1>
<table>
<tr>
<th>Id</th>
<th>Name</th>
<th>Price</th>
<th>Url</th>
<th>Created</th>
<th>Updated</th>
</tr>
@foreach($data as $val)
<tr>
<td>{{$val->id}}</td>
<td>{{$val->name}}</td>
<td>{{$val->price}}</td>
<td>{{$val->url}}</td>
<td>{{$val->created_at}}</td>
<td>{{$val->updated_at}}</td>
</tr>
@endforeach
</table>
</body>
</html>
$dataがコントローラーから受け取る変数です。ここではテーブル内容のモデルのオブジェクトリストをもらいますので、foreachで反復して表示しています。
Bladeではディレクティブと呼ばれる@で始まる命令を使って、HTMLタグとの分離を図っています。
@if / @unless / @empty / @isset / @foreach / @while / @break / @continue / @php / @section / @yield
など の記述で、テンプレートにコードを埋め込むことができます。
実はモデルクラスのapp/Item.php
はコマンドで雛形を作ってから何もコードを書いていません。
それでも基本のデータ挿入、検索、更新、削除はできるのです。