環境構築
- 以下コマンドを実行しlaravelコマンドを使えるようにする
composer global require laravel/installer laravel --version
2.この辺入れとく
yum install php php-mbstring
yum -y install php-zip
yum install php-xml
3.プロジェクト作成
laravel new projectA
4.書き込み権限が必要なので以下実行
chmod -R 777 bootstrap/cache
chmod -R 777 storage
5.bootstrap入れるなら
composer require twbs/bootstrap
6.composer.json内を環境に合わせて修正
#laravelを使用する
1.table名は複数形(modelを使う場合、後からphpでテーブルを指定しないけない)
2.関数名
- 登録 = create
- 削除 = delete
#artisan
- 一覧確認
php artisan list
- model作成
php artisan make:model Test
- controller作成
php artisan make:controller UserController
- service作成
php artisan make:service TestService
#dbへ接続
1.artisanコマンドを使用しテーブル作成
テーブル名:tests(laravelの命名規則としてテーブル名は複数形)
php artisan make:migration create_tests_table
2.database設定
- database.phpファイル変更
- .envファイル変更
3.認証方式変更
SELECT user, host, plugin FROM mysql.user;
-- 認証方式をcaching_sha2_passwordからmysql_native_passwordに変更(caching_sha2_passwordはlaravelでエラーになるため)
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'verysecret';
4.テーブル作成
php artisan migrate
5.laravelアプリからDBへ接続できるか確認
php artisan tinker;
tinker実行によりphpがコマンドラインから使用できるようになるためmodelを使用しデータを取得してみる
use App¥User;
User::first();
exit;
- apiの関数の動きを軽く確認する場合
例:App\Http\Controllers\Api\User\commonディレクトリ内のUco01wController.php内のusername関数を呼び出す
$uco01w = new App\Http\Controllers\Api\User\common\Uco01wController
$uco01w->username()
#model
1.model作成
以下コマンドでapp直下にTest.phpが作成される
命名規則としてはテーブル名が複数形のためモデルは単数形になる
php artisan make:model Test
#controllerからdb接続
use App\Test; // Testモデルを呼び出す(classの上に記述)
$test = Test::first(); // 1件取得
#キャッシュクリア
php artisan cache:clear
php artisan config:clear
php artisan route:clear
php artisan view:clear
# デバッグバー表示
- デバッグツールダウンロード
composer require barryvdh/laravel-debugbar
- 以下編集
'debug' => env('APP_DEBUG', true),
APP_DEBUG=true
#sassを使用
- コンパイル先指定
mix.js('resources/js/app.js', 'public/js')
.sass('resources/sass/app.scss', 'public/css')
.sass('resources/sass/header.scss', 'public/css')
.sass('resources/sass/pages/fr01u1.scss', 'public/css/pages');
既存DBからマイグレーションファイル作成
- パッケージのインストール
composer require --dev "xethron/migrations-generator"
- 作成コマンド
php artisan migrate:generate --ignore="users, password_resets"
Next Batch Number is: 3. We recommend using Batch Number 0 so that it becomes the "first" migration [Default: 0] は0を選択
参考サイト https://qiita.com/yukibe/items/4160f6522cab8ec40f59
#既存テーブルからmodel作成
- パッケージのインストール
composer require krlove/eloquent-model-generator --dev
- model作成コマンド
例:
App¥Modelsの中に「table_tests」テーブルのモデル「TableTest」を作成する
php artisan krlove:generate:model TableTest --table-name=table_tests --output-path=Models --namespace=App¥Models --no-timestamps
参考資料:
日本語手順
https://oki2a24.com/2019/06/06/generate-model-from-existing-database-in-laravel-5-5/
公式(github)
https://github.com/krlove/eloquent-model-generator
#シーダーの作成
1.シーダーファイルの作成
# 複数形
php artisan make:seed TestsTableSeeder
use Illuminate\Support\Facades\DB;
public function run()
{
DB::table('tests')->insert([
'name' => str_random(5),
]);
}
2.app/database/seeds/DatabaseSeeder.phpを編集
$this->call(TestTableSeeder::class);
php artisan db:seed
ダミーデータの作成
- fakerのインストール
composer require fzaninotto/faker --dev
- testsテーブルにダミーデータを作成(Testsのモデル作成必要)
<?php
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
use Faker\Factory as Faker;
use App\Models\Test;
class TestsTableSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
//一括削除
Test::truncate();
// フェイクデータを生成するジェネレータを作成
$faker = Faker::create('ja_JP');
for ($i = 0; $i < 1000; $i++) {
# code...
DB::table('tests')->insert([
// 'name' => str_random(5),
// 'name' => $ramdomName,
'name' => $faker->name,
]);
}
}
- seeder実行
php artisan db:seed;
factoryを使用してダミーデータを作る
- ダミーデータを日本語化
'faker_locale' => 'ja_JP',
- factoryを作成
php artisan make:factory TestFactory
- factoryを編集
<?php
/** @var \Illuminate\Database\Eloquent\Factory $factory */
use Faker\Generator as Faker;
$factory->define(App\Models\Test::class, function (Faker $faker) {
return [
'name' => $faker->name,
];
});
modelでTestを使うように修正指定しています。
- seederでfactoryを使用する
//factoryを利用(Testsテーブルにダミーデータを1000件作成)
factory(Test::class, 1000)->create();
php artisan db:seed
FormRequest
- エラー発生時のレスポンス
protected function failedValidation(Validator $validator)
{
throw new HttpResponseException(
response()->json([
'message' => $validator->errors()->toArray(),
], 403)
);
}
複合プライマリキーのsave
- 以下の記述で複合主キーに対応できる
- increment=falseがない場合
local.ERROR: Illegal offset type
になるので注意
trait HasMultipleKeysRelationships
{
public function hasOneMultipleKeys($related, array $foreignKeys, array $localKeys, $relation = null): HasOneMultipleKeys
{
// If no relation name was given, we will use this debug backtrace to extract
// the calling method's name and use that as the relationship name as most
// of the time this will be what we desire to use for the relationships.
if (is_null($relation)) {
$relation = $this->guessHasOneOrManyRelation();
}
$instance = $this->newRelatedInstance($related);
return $this->newHasOneMultipleKeys(
$instance->newQuery(),
$this,
$foreignKeys,
$localKeys,
$relation
);
}
public function hasManyMultipleKeys($related, array $foreignKeys, array $localKeys, $relation = null): HasManyMultipleKeys
{
// If no relation name was given, we will use this debug backtrace to extract
// the calling method's name and use that as the relationship name as most
// of the time this will be what we desire to use for the relationships.
if (is_null($relation)) {
$relation = $this->guessHasOneOrManyRelation();
}
$instance = $this->newRelatedInstance($related);
return $this->newHasManyMultipleKeys(
$instance->newQuery(),
$this,
$foreignKeys,
$localKeys,
$relation
);
}
}
##################### 使用側のクラス 上記のtraitクラスをクラス内でuseして使用
public function userAddress(): HasOneMultipleKeys
{
return $this->hasOneMultipleKeys(
Address::class,
['user_id', 'post_id'],
['user_id', 'post_id'],
);
}