laravel – model で mysql からデータ抽出

model を使って mysql からデータを抽出します。
model の使い方がよくわからなくてちょっとハマってしまいました。

イメージ

steemit.com より頂きました。

.env の編集

mysql に接続するための設定をします。


nano .env
.env

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=sample
DB_USERNAME=root
DB_PASSWORD=pass

命名規則

laravel には命名規則というものがあります。
慣れればコードが簡略化されるのでいいのでしょうが、慣れないとかえって面倒な感じがします。

データベースのテーブル名は必ず小文字から始まって複数形です。
model や controller にも規則があります。

テーブル名tests小文字で始まって複数形
modelTest大文字で始まって単数形
controllerTestControllerモデル名 + Controller

model の作成

まずは model を作成します。


php artisan make:model Test

以下のような model が作成されます。

app/Models/Test.php

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Test extends Model
{
    use HasFactory;
}

そして、この model は変更する必要はありません。
ここがすごいところです。

これで tests テーブルと自動的に接続するようです。

controller の作成

次に controller を作成します。


php artisan make:controller TestController

以下のような controller が作成されます。

app/Http/Controllers/TestController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class TestController extends Controller
{
    //
}

これを以下のように書き換えます。

app/Http/Controllers/TestController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Test;// これを追加

class TestController extends Controller
{
    public function index (Request $request)
    {
        $alldata = Test::all();
        return view('select', compact('alldata'));
    }
}

「use App\Models\Test;」を追加しないと Class not found になります。
ここがハマったところでした。

あとは直観的にわかりやすいと思います。

「$alldata = Test::all();」は多分 model を呼び出しているんだろうと思います。
デフォルトでは tests テーブル情報を取得しますが、これは model 内で変更可能なようです。

取得したデータをすべて select.blade.php に渡します。

select.blade.php

これは以前と同じにしました。
いろいろ継承したりできるようですが、それは後で取り組みます。

resources/views/select.blade.php

<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
	@foreach ($alldata as $ev )
		{{ $ev }}<br>
	@endforeach
</body>
</html>

routing

最後に routing です。

routes/web.php

Route::get('/select', 'App\Http\Controllers\TestController@index');

アドレスバーに「127.0.0.1:8000/select」と入力。