2017/08/02
Laravel5.4 MySQLと接続の続きです。内容的には新たにやり直していきます。
おさらい。
- ComposerをインストールしてLaravelを任意(blog)のフォルダにインストールします。
- phpmyadmin(コマンドプロンプトでもいい)でDB自体を作成します。
- MySQLを使いたいので.envファイル(インストールフォルダ直下)に接続情報を書きます。
- php artisan migrate(エラーが出たら /app/Providers/AppServiceProvider.php の修正)
- DBにテーブル作成のためphp artisan make:migration create_テーブル名_table --create=テーブル名
- 上記でatabase/migrationフォルダに自動作成されるマイグレーションファイルにカラム情報を追記
- php artisan migrate
という作業をしてきました。4のエラー処理がなければ7の作業にまとめても大丈夫です。
LarabelはMVCモデルのなんちゃらなので、DBのテーブルからデータを引っ張りだすのにモデルを作成します。
Larabel モデルの作成
Laravelはフレームワークということでいろいろなことを自動でやってくれる機能があり、モデルもコマンドで作成できます。
Laravel 5.4 Eloquent:利用の開始によれば
php artisan make:model テーブル名
のコマンドでモデルが自動作成されるようです。この時のテーブル名は一文字目を大文字にして単数形にするようです。自動的に小文字名の複数形テーブルと紐づくそうです。更に--migrationか-mのオプションを付けて実行するとマイグレーションファイルも自動で生成されるということです。なので上記の5の作業を同時にしてくれるということですね。テーブル作るとおそらくそのテーブルにアクセスするためのモデルは必要になってくるので理にかなってますね。
articleテーブルを新たに作成します。
php artisan make:model Article -m
とします。
database/migrationsフォルダ内に日付_create_テーブル名_table.phpというファイルが作成されます。
2017_08_01_065247_create_articles_table.php
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateArticlesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('articles', function (Blueprint $table) {
$table->increments('id');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('articles');
}
}
up()の中にカラム情報を追記します。
public function up()
{
Schema::create('articles', function (Blueprint $table) {
$table->increments('id');
$table->char('title', 100);
$table->text('descript')->nullable();
$table->integer('category');
$table->text('comment');
$table->timestamps();
});
}
4つのカラムを追加します。そして先ほどのphp artisan make:model Article -mでモデルが作成されていますので確認します。
インストールフォルダ/Appの下にArticle.phpというファイルが作成されています。
Article.php
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Article extends Model
{
//
}
Articleクラスの中は空っぽです。この中にテーブルのカラム名を列挙します。
protected $fillable =['カラム名','カラム名','カラム名'];
$fillableで指定されたカラムは勝手に代入できるカラムということらしいです。オートインクリメントのカラムやらサーバーの時間を記録しておくupdated_atカラムなど勝手に代入されてはいけないカラムは外しておきます。
Article.php変更後
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Article extends Model
{
protected $fillable =['title','descript','category','comment'];
}
テーブルを作成します。
php artisan migrate
うまくテーブルが作成されたようです。phpmyadminで確認してみます。
テーブルが作成され追加したカラムが作成されています。データは空なのでとりあえずphpmyadminで1件だけ入力しておきます。データの内容は適当です。また別の機会にinsertを行いたいと思います。
サーバーにアクセスがあったらroutesフォルダのweb.phpからコントローラーを呼んで、そこからモデルを呼んでviewに返す流れだと思いますが、コントローラーを作らずに仮にテーブルの値をviewに表示してみます。おそらく邪道です。まったく邪道だと思います。
viewファイルを作成します。インストールフォルダ/resources/wiewsの中にarticle.blade.phpを作成します。
article.blade.php
<!doctype html>
<html lang="{{ app()->getLocale() }}">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Document</title>
</head>
<body>
<table class="table">
<tr>
<th>id</th>
<th>title</th>
<th>descript</th>
<th>category</th>
<th>comment</th>
</tr>
<tr>
<td>{{ $article[0]['id'] }}</td>
<td>{{ $article[0]['title'] }}</td>
<td>{{ $article[0]['descript'] }}</td>
<td>{{ $article[0]['category'] }}</td>
<td>{{ $article[0]['comment'] }}</td>
</table>
</body>
</html>
{{ $article[0]['id'] }}というのが突然出てきますがと同じでしょう。$articleが2次元配列になっています。$articleはweb.phpから渡しますので今のところはそんなもんだと思っておきます。二つ目の添え字がテーブルのカラム名になっています。これでこのテーブルのカラムの値が取得できます。
2回目になりますが、こんな使い方はしないと思いますがweb.phpの中でコントローラーを呼ばずに直接モデルを使います。インストールフォルダ/routes/web.phpにarticleテーブルのモデルファイルのArticleクラスが使えるように
use App\Article;
と記述します。これでweb.phpからモデルファイル内のクラスが使用できます。直接記述されていませんがclass Article extends Modelとなっていますので継承元のModelにいろいろなメソッドがあるはずです。インストールフォルダ\vendor\laravel\framework\src\Illuminate\Database\EloquentのModel.phpにあるはずです。
$article = Article::all();
allメソッドですべてのデータを取得してくれるようです。これをphpのcompact関数(変数名とその値から配列を作成)に渡してあげたものをviewに渡します。
web.php
<?php
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
use App\Article; // モデルを呼ぶ
Route::get('/', function () {
return view('welcome');
});
Route::get('/article', function () {
$article = Article::all(); // モデル内のクラスのallメソッドですべてのデータ取得
return view('article',compact('article')); // 配列にしてviewに投げる
});
決してこんな使い方はしないと思いますが、コントローラーをすっ飛ばしてデータベースの値をとってきて表示してみました。 return view('article',第2引数);の第2引数を配列にするとviewに変数を渡すことができます。
分かりやすいようにviewファイルにcssを設定しています。
Laravel5.4 MySQLと接続おさらい
- テーブル作成はモデルもそのうち作成すると思われるので
php artisan make:model テーブル名 -m
でモデルファイル、マイグレーションファイルを一緒に作る(テーブル名は頭大文字単数形) - マイグレーションファイルにはカラム情報を書く
- モデルファイルには
protected $fillable =['カラム名','カラム名','カラム名'];
の形で書き込んでいいカラムを列挙する - php artisan migrate
- とりあえずテーブルに確認用のデータを入力(データ入力方法は別の機会に)
- 表示用のviewファイルを作成(投げられてくる変数を記述しておく)
- web.phpファイルでモデルファイルを読み込み
use App\モデル; - モデルクラスのallメソッドで全データ取得
- return viewの第二引数にデータを配列形式で書いてviewに投げる
- viewファイルにアクセス
ということでした。
やらないといけないことをメチャ飛ばしているようです。次回はコントローラ経由で同じことをする予定です。