いつも忘れるので、備忘録
環境構築
1.composerをインストール
composer
https://getcomposer.org/download/
2.laravelをインストール
XAMPPのshellかパワーシェル上でhtdocsへ移動し、目的の場所に行き、コマンドを打つ
今回はXAMPP上でhtdocs内にblogというプロジェクトを作る。
// Laravelインストール # composer global require laravel/installercomposer create-project --prefer-dist laravel/laravel laravel // もしくは composer create-project laravel/laravel プロジェクト名 --prefer-dist //# laravel new laravel_app
以下 CRUD 参考
こっちのほうがわかりやすいか
Laravel 学習中
https://laraweb.net/basic_knowledge/
データベースの設定: マイグレーション
手順
- データベース側設定
- マイグレーションファイルの作成 :データベースの設計するファイル
- マイグレーションファイルの編集 :データベースへどういったファイルを入れるか書く
- マイグレーション実行:データベースへ反映
- サンプルデータを入れる。
データベース側設定
まずは、データベースを作り、そして表示させてみるか
今回 abcというプロジェクトを作る。
c:\xampp\htdocs # laravel new abc ---(省略)---- Discovered Package: facade/ignition Discovered Package: fideloper/proxy Discovered Package: laravel/tinker Discovered Package: nesbot/carbon Discovered Package: nunomaduro/collision Package manifest generated successfully. Application ready! Build something amazing.
次にデータベース連携の.env にXAMPPの連携を修正
DB_CONNECTION=mysql DB_HOST=localhost DB_PORT=3306 DB_DATABASE=abc DB_USERNAME=abc_admin DB_PASSWORD=abc_admin!
XAMPP側にもユーザ用意してテーブルも用意しておく
照合順序はutf8mb4_binに。
@see laravel使うならmysqlのcollation指定はutf8mb4_binにしておくべき
マイグレーションファイルの作成
早速、実行
php artisan make:migration マイグレーションファイル名 # 例 php artisan make:migration create_users_table
お、エラー
# php artisan make:migration create_users_table InvalidArgumentException : A CreateUsersTable class already exists. at C:\xampp\htdocs\abc\vendor\laravel\framework\src\Illuminate\Database\Migrations\MigrationCreator.php:90 86| } 87| } 88| 89| if (class_exists($className = $this->getClassName($name))) { > 90| throw new InvalidArgumentException("A {$className} class already exists."); 91| } 92| } 93| 94| /**
A CreateUsersTable class already exists.ってんだからもうあるってことかデフォとのあれか
じゃ、違うテーブルを用意するか
今回は見積もり書システムなので、そのままmitsumori
# php artisan make:migration create_mitsumori Created Migration: 2020_01_11_092917_create_mitsumori
おk
イグレーションファイルの編集 :データベースへどういったファイルを入れるか書く
出来たファイルを見てみると
<?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; class CreateMitsumori extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('mitsumori', function (Blueprint $table) { $table->bigIncrements('id'); $table->timestamps(); // ■ ここにカラムを追加していく }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('mitsumori'); } }
ざっくり必要なカラムを設計すると
// 思案(´・ω・)ス というか思案 見積書番号: お客様名 : 弊社担当者: タイトル : 取引条件 : 銀行振り込みとか・何日支払いとか 納品予定日: 受注後○週間以内とか お見積り日: 有効期限日: 納品場所 : 小計額 : 消費税 : 原価率 : 税率 : 合計金額: 備考欄 : 上記13項目と 品名、品名数量、単位、単価、原価、金額、利益額、が25個、 ※見積条件 という項目は削除し、相手に出す見積もりだが、原価が計算が必要なので、 それぞれ追加した。カラムが結構あるな、
まずは必要な部分だけ作るか。
見積書番号:
お客様名 :
弊社担当者:
タイトル :
小計額 :
消費税 :
税率 :
合計金額:
タイプスタンプ:
……この9個作る。
見積書番号:
$table->bigIncrements(‘id’);
必須と8桁のゼロフルにしたい。オートインクリメントにしたい。
参考:laravelのmigrationでintのカラムが勝手にAutoIncrementにされてハマった話
https://qiita.com/haruraruru/items/8ed08a5dfd719ebb9a2e
https://readouble.com/laravel/5.5/ja/migrations.html
Laravelが5になってもmigrationにZEROFILLは対応してないので、 migrationに直接SQL書いて実行というパターンは変わらないです。 https://www.kaasan.info/archives/3864
じゃ、整数でオートインクルメントでいいか。
せっかくならコメント入れておくか。
Schema::create('mitsumori', function (Blueprint $table) { $table->bigIncrements('id') ->comment('見積書番号'); $table->string('customer') ->comment('お客様名'); $table->string('staff') ->comment('弊社担当者'); $table->string('title') ->comment('タイトル'); $table->integer('sub_total') ->comment('小計額'); $table->integer('tax') ->comment('消費税額'); $table->tinyInteger('tax_rate') ->comment('税率'); $table->integer('total') ->comment('合計金額'); $table->timestamps(); });
※上記timestampsでエラーで迷走した。
マイグレーション実行:データベースへ反映
php artisan migrate
なんかエラーが出た
以下エラーの記録(´・ω・)ス
Symfony\Component\Debug\Exception\FatalThrowableError : Call to a member function comment() on null at C:\xampp\htdocs\abc\database\migrations\2020_01_11_092917_create_mitsumori.php:25 21| $table->integer('sub_total') ->comment('小計額'); 22| $table->integer('tax') ->comment('消費税額'); 23| $table->tinyInteger('tax_rate')->comment('税率'); 24| $table->integer('total') ->comment('合計金額'); > 25| $table->timestamps() ->comment('タイムスタンプ'); 26| }); 27| } 28| 29| /**なんぞ?
Call to a member function comment() on null
ああ、カラム名が入ってないや。
タイムススタンプ空でおkSchema::create('mitsumori', function (Blueprint $table) { $table->bigIncrements('id') ->comment('見積書番号'); $table->string('customer') ->comment('お客様名'); $table->string('staff') ->comment('弊社担当者'); $table->string('title') ->comment('タイトル'); $table->integer('sub_total') ->comment('小計額'); $table->integer('tax') ->comment('消費税額'); $table->tinyInteger('tax_rate') ->comment('税率'); $table->integer('total') ->comment('合計金額'); $table->timestamps('insert_at') ->comment('タイムスタンプ'); }); }
またコケた
Illuminate\Database\QueryException : SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntaxなんぞ?
@SEE
php artisan migrate でずっこけたとき
https://qiita.com/oishis/items/88744f017601f3084ab7
最後に消して……だめか
無事にマイグレーションができたところで、DB確認ちゃんとカラムあること確認
次にダミーデータを入れてみる。
サンプルデータを入れる
1.シーダーファイルを作成
2.シーダーファイルの run() にサンプルデータを記述
3.DatabaseSeeder.php でシーダーファイルをコール
4.シーダーの実行
シーダーファイルを用意
php artisan make:seed mitsumoriTableSeeder // 実行 # php artisan make:seed mitsumoriTableSeeder Seeder created successfully.
コマンドを実行すると database/seeds/ に mitsumoriTableSeeder.php(シーダーファイル) が作成された。このファイルを編集してデータを入れる。
シーダーファイルの run() にサンプルデータを記述
<?php use Illuminate\Database\Seeder; class mitsumoriTableSeeder extends Seeder { /** * Run the database seeds. * * @return void */ public function run() { //ここにデータを記載 } }
これだといちいちデータを作るのか、調べると
seeder(シーダー)・・ダミーデータを登録できる faker(フェイカー)・・ダミーデータを生成できる factory(ファクトリー)・・ダミーデータの量産装置
らしい。
少しのデータならシーダでいいが、大量なのでfaker(フェイカー)とfactory(ファクトリー)を使うか。
php artisan make:factory MitsumoriFactory //実行 # php artisan make:factory MitsumoriFactory Factory created successfully.
/database/factories/MisumoriFactory.php というファイルができる。
TOOD ここはあと回しに。ダミーデータ作るのが面倒
INSERT INTO `mitsumori` (`id`, `customer`, `staff`, `title`, `sub_total`, `tax`, `tax_rate`, `total`, `created_at`, `updated_at`) VALUES (NULL, 'お客様名01', '1', 'お見積り1タイトルの件', '10000', '1000', '10', '11000', '', ''), (NULL, 'お客様名02', '1', 'お見積り2タイトルの件', '10000', '1000', '10', '11000', '', ''), (NULL, 'お客様名03', '1', 'お見積り3タイトルの件', '10000', '1000', '10', '11000', '', ''), (NULL, 'お客様名04', '1', 'お見積り4タイトルの件', '10000', '1000', '10', '11000', '', ''), (NULL, 'お客様名05', '1', 'お見積り5タイトルの件', '10000', '1000', '10', '11000', '', ''), (NULL, 'お客様名06', '1', 'お見積り6タイトルの件', '10000', '1000', '10', '11000', '', ''), (NULL, 'お客様名07', '1', 'お見積り7タイトルの件', '10000', '1000', '10', '11000', '', ''), (NULL, 'お客様名08', '1', 'お見積り8タイトルの件', '10000', '1000', '10', '11000', '', ''), (NULL, 'お客様名09', '1', 'お見積り9タイトルの件', '10000', '1000', '10', '11000', '', '');
これを一覧表示させてみる。
データベースから読み込み込んで一覧にしてみる
サーバ起動
このままだとXAMPPなので、URLが http://localhost/abc/public/なので、サーバを起動。
Laravelで作られたディレクトリー内で、
php artisan serve 実行 # php artisan serve Laravel development server started: http://127.0.0.1:8000
ルーティングを使う
web.php
Route::get('/', function () { return view('index'); });
resources/views
わかりやすいルーティング
Viewはresources/viewsに記載
テンプレートはxxx.blade.php
View内に分ける場合、
return view('mitsumori.index'); return view('mitsumori/index')ではない事に注意 スラッシュでなくてドットね。
メモ:ルーティングとビューでは処理が増えるので、コントローラーに書く
場所は/app/Http/Controllers/に書く
コントローラー書くにのは artisan を使う。
php artisan make:controller コントローラー名最初は大文字 例)php artisan make:controller HelloController
見積もりリストを作るコントローラーを作る。
# php artisan make:controller MitsumorilistController// ↑ //コントロール内にアクションを作るのでlistは無しね。 // ↓ 作り直した(´・ω・)ス # php artisan make:controller MitsumoriController
web.phpにルートを記載
Route::get('/mitsumori/', 'MitsumoriController@index');
Symfony\Component\Debug\Exception\FatalThrowableError Class 'App\Http\Controllers\DB' not found http://127.0.0.1:8000/mitsumori/
…とエラーがでるので、
use Illuminate\Support\Facades\DB;
上記をコントローラーに追加
参考:SQLクエリの実行
https://readouble.com/laravel/5.4/ja/database.html
コントローラーの記載は、
<?php namespace App\Http\Controllers; use Illuminate\Support\Facades\DB; use Illuminate\Http\Request; class MitsumoriController extends Controller { //一覧表示用 public function index(){ $list = DB::select("SELECT * FROM `mitsumori`"); var_dump($list); } }
モデルを用意する記載する
モデルを作ると上記の$list = DB::select(“SELECT * FROM `mitsumori`”);という部分が省略できる。
早速モデルをartisanで作る。
php artisan make:model モデル名最初は大文字 実行してみる # php artisan make:model Mitsumori Model created successfully.
app ディレクトリ直下にMitsumori.phpができる。
<?php namespace App; use Illuminate\Database\Eloquent\Model; class Mitsumori extends Model { // }
次にコントローラーのappの中のモデルを指定、
SQLSTATE[42S02]: Base table or view not found: 1146 Table 'abc.mitsumoris' doesn't exist (SQL: select * from `mitsumoris`)
またエラーかテーブル名が複数形じゃなければだめか
表示ができたぞ、OKだな。
モデルがあれば、DBは複数形は忘れないようにしないとな。
配列に入れて表示する
//一覧表示用 public function index(){ $lists = Mitsumori::all(); //$list = DB::select("SELECT * FROM `mitsumori`"); //var_dump($list); foreach($lists as $list){ var_dump($list->title); }
ここで、ビューを指定して渡すことができる。
ビューの渡された値を表示
find
findOrFail
action(
ここで基本のCRUDをもう一度作るか。
@View
@yield イールド
@section
https://readouble.com/laravel/5.5/ja/blade.html
よしここで再度記述し直すか