LoginSignup
1
4

More than 5 years have passed since last update.

Laravel基礎(4)データベースを使う

Last updated at Posted at 2018-10-14

接続設定

Laravelでデータベースを使うために接続情報をLaravelプロジェクトディレクトリの直下にある.envファイルに適切に書きます。
今回は、MySQLを使いますので、事前のMySQLを起動しておく必要があります。

(~/.env)
・・(一部抜粋)・・
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
のなかに必要なテーブル定義を書きます。

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するようにコードを書きます。

database/seeds/ItemTableSeeder.php
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 

コントローラーにメソッドを用意します。

app/Http/Controllers/ItemController.php

<?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();
    } 

ルーティング情報はコントローラークラス@メソッドを定義します。

routes/web.php
Route::get('/list','ItemController@getList');

View(Blade)の配置場所


mkdir resources/views/item

ビューではコントローラーから受け取る結果を表示します。

resources/views/item/list.blade.php

<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 はコマンドで雛形を作ってから何もコードを書いていません。
それでも基本のデータ挿入、検索、更新、削除はできるのです。

1
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
4