- 投稿日:2019-07-04T23:32:15+09:00
【Laravel初心者による備忘録】Laravelデータベースの基本!
Laravelでデータベースを使うなら
Laravelでデータベースを使うなら、DBクラスかEloquentのどちらかを使います。
DBクラス
データベースアクセスのための基本的な機能をまとめたクラス。クエリビルだという機能も用意されている。
Eloquent
ORMを実装したもの。
ORMの説明(Wikipediaより引用)
データベースとオブジェクト指向プログラミング言語の間の非互換なデータを変換するプログラミング技法である。オブジェクト関連マッピングとも呼ぶ。
前提知識 CRUD
データベース操作の基本はCRUD(Create,Read,Update,Delete)の実装です。
SQLでは(INSERT,SELECT,UPDATE,DELETE)が対応する。1.DBクラス
必要な手続き
データベースを設定する
config/database.phpの冒頭にある'default'の第二引数を使用したいデータベース名に設定すればOK。sqliteならsqlite、MySQLならmysql。
'default' => env('DB_CONNECTION', データベース名),環境変数を設定する
.envファイルに環境変数がまとめられているので、この中のDB_CONNECTIONとDB_DATABASEを編集する。
DB_CONNECTION=データベース名 DB_DATABASE=使用するデータベースファイルのパスを指定コントローラの修正
DB:selectで指定したSQL文を実行し、データベースからレコードの情報を取り出します。
use Illuminate\Support\Facades\DB; $変数 = DB::select(実行するSQL文);DBクラス内でのCRUD
冒頭でCRUDについて述べたと思うのですが、DBクラスでは以下の静的なメソッドを用います。
CRUD メソッド C DB::insert(クエリ文,パラメータ配列); R DB::select(実行するSQL文); U DB::update(クエリ文,パラメータ配列); D DB::delete(クエリ文,パラメータ配列); テンプレートの修正
@foreachディレクティブなどを使用してデータを活用します。
ディレクティブに関しては以下の記事に記載してあります。クエリビルダ
LaravelのDBクラスにはクエリビルダという機能が用意されています。
クエリビルダ=SQLのクエリ文を生成するために用意されたメソッド2.Eloquent
必要な手続き
データベースを設定する
config/database.phpの冒頭にある'default'の第二引数を使用したいデータベース名に設定すればOK。sqliteならsqlite、MySQLならmysql。
'default' => env('DB_CONNECTION', データベース名),環境変数を設定する
.envファイルに環境変数がまとめられているので、この中のDB_CONNECTIONとDB_DATABASEを編集する。
DB_CONNECTION=データベース名 DB_DATABASE=使用するデータベースファイルのパスを指定モデルの作成
artisanコマンドでモデルを作成します。作成されたモデルはappフォルダに配置されます。
php artisan make:model モデル名便利なツール
シーディングとマイグレーションはどちらの手法でも使える便利なものです。
シーディング
シード=最初から用意しておくコード
シーディングとはシードを作成する機能のこと。
初期状態でダミーのデータがあると便利。シーダーファイルの作成
artisanコマンドでシーダーファイルを作成します。作成されたシーダーファイルはdatabase/seedsフォルダの中に配置されます。
php artisan make:seeder シーダー名このファイルのrunメソッドにシーディング処理を記入します。
シーディングの登録
このシーダーファイルをdatabase/seeds/DatabaseSeeder.phpに登録します。
runメソッドに以下のように記入してください。$this->call(シーダークラス::class);シーディングの実行
以下のコマンドを使用してシーディングを実行します。
php artisan db:seedマイグレーション
現在使っているデータベースと全く同じ構造を再現するための仕組みのこと。データベースの移行したり、環境を移行したりする際に一からデータベースを作り直しのは大変。データベースを効率よく管理したいなら、マイグレーションを利用するべき!
マイグレーションファイルの生成
以下のコマンドを実行してマイグレーションファイルを作成します。
php artisan make:migration ファイル名database/migrationsの中に生成したマイグレーションが追加されます。
生成したファイルの中にはMigrationを継承したクラスが作成されています。このクラスにつのメソッドが用意されています。
- upメソッド(テーブルを生成するための処理)
- downメソッド(テーブルを消去するための処理)
それぞれ必要な処理を記述します。
主要な型の設定
説明 コマンド プライマリキー $table->increments(フィールド名); 整数 $table->integer(フィールド名); 実数 $table->float(フィールド名); 文字 $table->String(フィールド名); 真偽値 $table->boolean(フィールド名); 日時 $table->dateTime(フィールド名); NULL値可能なcreated_atとupdated_atカラム追加 $table->timestamps(); マイグレーションの実行
以下のコマンドを実行してマイグレーションを実行する。
php artisan migrateコンソールにメッセージが出力され、テーブルが用意される。
多くのチュートリアルでは・・・
以下のチュートリアルでは、マイグレーションを作成しEloquentを用いてデータベースを作成していました。
- 【Laravel 5.7対応】掲示板を作成するチュートリアル
- Laravel5.4でシンプルなCMSを作るチュートリアル
- Laravel 5.5 入門として「基本のタスクリスト」を作成する [その1]
個人的に苦しんだエラー特集
以下の記事を参考にしてDockerの環境を構築しました。
目的(機械学習のついでに、ローカルを汚さないようにするために...など)が果たせればOKと判断して雰囲気でDocker使ってたので、今回苦労しました(・・;) 夏休みあたりにちゃんとDocker勉強します?
Dockerでマイグレーションが作成できない
.envの
DB_HOSTをデフォルト設定から変更する必要がある。docker-compose.ymlでserviceとして定義した名前を使用する。phpMyAdminにログインできない
環境変数内(.env)のユーザーネーム、パスワード、サーバ名、全て同じものを使用してログインを試みたのに何度試しても失敗。
もう一度コンテナを作り直したら解決した。原因不明?
このエラー解消に恐ろしく時間取られたのが本当に悔しい...!参考
- 投稿日:2019-07-04T23:12:00+09:00
Laravel 導入手順(未完成)
Laravel 導入手順 1
Laravel初心者がデプロイ目指してわかったところを記録していくための備忘録
筆者の環境:MacOSComposerの導入
Laravelはインストールの他、プロジェクトを立ち上げる度にComposerというコマンドラインソフトを使うらしい。
初回は以下のホームページからダウンロードする。https://getcomposer.org/download
ダウンロードした composer.phar を
/usr/local/bin/composerへ移動するのでターミナルで以下のコマンドを打つ。cd ~/downloads sudo mv composer.phar /usr/local/bin/composer.pharこれはパスを通してファイル名だけでコマンドを起動する為の準備です。
なので、任意のディレクトリにcomposer.pharを移動して、毎回そこにcdで移動しても起動すると思いますがそれは大変だしどこへ行ったか分からなくなるので初めからパスの通っているところに動かしておきます。
慣れてる人は ~/bash.rc とかにexportしてパスを通しても同じ結果になると思いますが失敗して上書きすると大変な事になるので上記の方法が安心で簡単。
あと、
cd /usr/local/bin/ で入ってln -s composer.phar composerとやっておくとコマンド入力する時composerでもcomposer.pharでも動くようになる。
※補足: vs Java
他のサイトによると依存関係の管理を自動化してくれるとの解説があったので、恐らくだけど、ComposerってJavaだとMarvenとかGradleに相当するものだと思います。Projectの作成
Composerがインストールできたらプロジェクトを作成出来るようになっているので、
プロジェクトのルートフォルダにしたいところへcdで移動してから、terminalcomposer create-project Laravel/Laravel myapp --prefer-dictと打つとmyappという名前のプロジェクトができます。
myappの部分は自分が作りたいアプリの名前を入れる。
あと、スペースで区切られているオプションは入れ替えても動くみたいです。
例えば、
composer create-project Laravel/Laravel --prefer-dict myapp
でも同じ結果でした。(はじめのComposerはコマンド名だから固定)プロジェクトが認識されてるかテスト起動する
プロジェクトのルートディレクトリで
php artisan serveとするとララベルに(というかPHPに)内臓の簡易ローカルサーバーが立ち上がります。
MAMPとかTOMCATみたいなコンテナのテスト用お手軽版。
で、これを立ち上げて
http://localhost:8000/
にアクセスするとLaravelのサンプルページが表示されます。
終了するときはCtrl+cで。Controllerの作成
Laravelのアプリケーションプロジェクトは初期状態でControllerクラスが継承されていないらしい。
代わりに初期状態ではルーティング用のファイルに無名関数でコントローラが書かれている。web.phpRoute::get('/', function () { return view('welcome'); });しかし、このファイルは本来送られてきた(ユーザーがアクセスしてきた)URLをコントローラーのアクションメソッドへ案内する為のもので、ここでコントロールするべきではないと思います。
やろうと思えば逆に、viewをreturnする代わりにstring型で文字列をreturnする(つまりHTMLタグをここへ書く)でも動く。
ルーティングができているかの動作テストするのにファイル作るのがめんどくさい時とかは役に立ちそう。さて、コントローラはアプリケーションプロジェクトのルートディレクトリで
terminalphp artisan make::controller IndexControllerとすればHttp/Controllersフォルダにファイルができています。
なお、最後のIndexContollerは任意の名前にできます。普通はviewの名前+Controllerにするのが良さそう?マイグレーションファイルを作る
自分自身まだよくわかっていないので間違っているかもしれないが、雑な解釈で行くとデータベーステーブルのモデル定義を自動生成してくれる事をマイグレーションというっぽい。
ここに記述したカラムをcreateしてくれる。
.sqlスクリプトファイルとどう違うのかはよく分からない。記法はSQLより簡単だけど似たようなものだと思う。※「マイグレーション」でググるとマイグレーションとは「移行」という意味だと書いてあったがこの場合はその解釈だとかえって意味不明なので、上記のような解釈で捉えています。
プロジェクトルートで
terminalphp artisan make:migration create_tablename_tableと打つとマイグレーションファイルができる。
databaseフォルダにmigrationsフォルダができていて、その中に生成したファイルがあるので開いて
テーブル定義を記述する。
(SQLのcreate table に相当することをここへ書く。)
書けたらterminalphp artisan migrateとやるとデータベースにテーブルが出る・・はずが出なかった。
エラーが出た。
Laravelのインストールの仕方によってはこれで成功するらしい。
もう解決したので忘れたが、ここでエラーが出た場合それをコピーしてググるとすぐ答えが出てくるのでその通りにする。私の場合、envファイルに指定された名前のdatabaseがMySQLになかった。
あとdbのユーザー名とパスワードが違った。
.envファイルを開くとMySQLの項目が見つかるので、そこで使いたいdatabase名などに書き換えればいける。
ユーザー名がroot パスワードなしの場合だと
パスワードは空欄にしておく。なんか入ってたらだめ。
databaseはmysqlコマンドで入ってアプリケーション名とかをつけて作ればいいと思う。
で作った名前で.envに書いておく。それでやり直したら接続できました。
- 投稿日:2019-07-04T22:19:54+09:00
Laravelの.envファイルと、config/database.phpファイルについてメモ
LaravelのDBを設定する際のメモ
下記ファイルについて、まとめておく。
.env config/database.php.env
.env は環境毎に変更したい情報をまとめておくファイルということだが、
ようは環境変数の設定を書いている。.envDB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=laravel DB_USERNAME=root DB_PASSWORD=config/database.php
.envファイルで設定した環境変数を取得して、DBの設定をしている。
config/database.php'default' => env('DB_CONNECTION', 'mysql'), 'connections' => [ 'sqlite' => [ 'driver' => 'sqlite', 'database' => env('DB_DATABASE', database_path('database.sqlite')), 'prefix' => '', ], 'mysql' => [ 'driver' => 'mysql', 'host' => env('DB_HOST', '127.0.0.1'), 'port' => env('DB_PORT', '3306'), 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), 'unix_socket' => env('DB_SOCKET', ''), 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', 'strict' => true, 'engine' => null, ], // .... ];env関数について
env関数はLaravelのヘルパ関数
公式
https://readouble.com/laravel/5.5/ja/helpers.htmlenv関数は
環境変数の値を取得する。
第2引数はデフォルト値。ex)'username' => env('DB_USERNAME', 'forge'),まとめ
Laravelの設定に関して、理解が深まった。
- 投稿日:2019-07-04T20:38:05+09:00
[メモ]Laravel Echoでbroadcasting/auth 404 NotFound
Laravel5.5で公式通りにEchoをインスタンス化したらエラー
broadcasting/auth 404 NotFound
出るし、Pusherからうけとれなかった。結局
authEndpoint:なるものを仕込んでうまくいった
http://localhostにアクセスしたときにlaravelプロジェクトを参照するようになっていれば躓かなかった模様bootstrap.jswindow.Echo = new Echo({ authEndpoint: 'http://【ドメインlocalhostとか】/【LaravelProject名】/public/broadcasting/auth', broadcaster: 'pusher', key: 'your-pusher-key', cluster: 'eu', encrypted: true });
- 投稿日:2019-07-04T20:19:09+09:00
Laravel5.8プロジェクトにGoogleログイン機能をつける
概要
DockerやPHPの勉強にと作成したLaravelプロジェクトにGoogleログイン機能をつけてみました。
手順
- GCPの設定
- Laravel側の設定
GCPの設定
GoogleCloudPlatform(GCP)の登録
Google認証を実装するには、まずGoogleCloudPlatform(GCP)の登録が必要です。
Googleアカウントがあれば簡単に出来ます。GCP:
https://console.cloud.google.com/getting-started?hl=jaプロジェクトの作成
GCPのホームから作成ができます。
2019.07現在では、「Google Cloud Platform」というロゴマークの右横にプロジェクト名が表示されてます。選択するとモーダルが開き「新しいプロジェクト」作成の導線が現れます。「プロジェクト名」には、とりあえずLaravelプロジェクトと同一の名前を、
今回は個人のテスト用なので「場所」はそのまま「組織なし」を選択し作成します。認証情報の設定
作成したプロジェクトから「APIとサービス>認証情報>OAuth同意画面」に移動します。
ここにもLaravelプロジェクトと同一の名前を入れました。
*Google認証をするときに一番上に出てくる「●●●●●」に移動の●部分に入ります。作成をクリックすると、APIとサービスのページに戻りモーダルが開くので
そこで「認証情報を作成>OAuthクライアントID」を選択します。下記の画面が表示されるので
「ウェブアプリケーション」にチェック、「名前」、「承認済みのリダイレクトURI」を埋めて作成します。「名前」は任意で、
「承認済みのリダイレクトURI」はLaravel側で使うのでそれを考慮に入れてください。
とりあえず今回は"http://localhost/auth/callback/google/" にしました。(重要)
作成したあと、「クライアントID」と「クライアントシークレット」が表示されます。後ほど使用するのでメモっておいてください。これでGCPの設定は終わりです。
Laravel側の設定
Laravelでの実装ですが、
今回は簡易的に行うため、Laravelのデフォルトで作られるusersテーブルをそのまま使います。このあと必要になるパッケージを先にインストール $ composer require laravel/socialite laravelデフォルトで用意されている認証機能作成のコマンド $ php artisan make:auth テーブル作成 $ php artisan migrate Migration table created successfully. Migrating: 2014_10_12_000000_create_users_table Migrated: 2014_10_12_000000_create_users_table Migrating: 2014_10_12_100000_create_password_resets_table Migrated: 2014_10_12_100000_create_password_resets_table さらに後ほど必要になるコントローラを作っておきます $ php artisan make:controller OAuthLoginController (dbコンテナにてテーブルが作られていることを確認しておく) mysql> show tables; +--------------------------+ | Tables_in_laravel-cloud9 | +--------------------------+ | migrations | | password_resets | | users | +--------------------------+ 3 rows in set (0.00 sec)必要な設定を追加していきます
src/.env先ほどGCPの設定の時に作成したものを使用します GOOGLE_CLIENT_ID=クライアントID GOOGLE_CLIENT_SECRET=クライアントシークレット GOOGLE_CALLBACK_URL=リダイレクトURLsrc/config/app.php// サービスプロバイダの登録 'providers' => [ /* * Laravel Framework Service Providers... */ Illuminate\Auth\AuthServiceProvider::class, Illuminate\Broadcasting\BroadcastServiceProvider::class, /* 省略 */ App\Providers\EventServiceProvider::class, App\Providers\RouteServiceProvider::class, Laravel\Socialite\SocialiteServiceProvider::class,//(追加) ], /* 省略 */ 'aliases' => [ 'App' => Illuminate\Support\Facades\App::class, 'Arr' => Illuminate\Support\Arr::class, /* 省略 */ 'Validator' => Illuminate\Support\Facades\Validator::class, 'View' => Illuminate\Support\Facades\View::class, 'Socialite' => Laravel\Socialite\Facades\Socialite::class,//(追加) ],src/config/services.phpreturn [ /* |-------------------------------------------------------------------------- | Third Party Services |-------------------------------------------------------------------------- | | This file is for storing the credentials for third party services such | as Stripe, Mailgun, SparkPost and others. This file provides a sane | default location for this type of information, allowing packages | to have a conventional place to find your various credentials. | */ /* 省略 */ 'stripe' => [ 'model' => App\User::class, 'key' => env('STRIPE_KEY'), 'secret' => env('STRIPE_SECRET'), 'webhook' => [ 'secret' => env('STRIPE_WEBHOOK_SECRET'), 'tolerance' => env('STRIPE_WEBHOOK_TOLERANCE', 300), ], ], /* 追加ここから */ 'google' => [ 'client_id' => env('GOOGLE_CLIENT_ID'), 'client_secret' => env('GOOGLE_CLIENT_SECRET'), 'redirect' => env('GOOGLE_CALLBACK_URL'), ], /* 追加ここまで */ ];src/routes/web.php/* 省略 */ Route::get('/home', 'HomeController@index')->name('home'); /* 省略 */ // Controllerメソッドへのルート定義 Route::get('/auth/{service}', 'OAuthLoginController@getGoogleAuth')->where('service', 'google'); Route::get('/auth/callback/google', 'OAuthLoginController@authGoogleCallback');src/app/Http/Controllers/OAuthLoginController.php<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\User; use Socialite; use Auth; class OAuthLoginController extends Controller { // Googleの認証ページへのリダイレクト処理 public function getGoogleAuth($provider) { return Socialite::driver($provider)->redirect(); } // Googleの認証情報からユーザー情報の取得 public function authGoogleCallback() { $googleUser = Socialite::driver('google')->user(); $user = User::firstOrNew(['email' => $googleUser->email]); if (!$user->exists) { $user['name'] = $googleUser->getNickName() ?? $googleUser->getName() ?? $googleUser->getNick(); $user['email'] = $googleUser->email; // Gmailアドレス $user['password'] = str_random(); // 適当に生成 $user->save(); } Auth::login($user); return redirect()->route('home'); } }最後に、ログイン画面にGoogleログイン用のボタンを用意します。
src/resources/views/auth/login.blade.php// ログイン画面にGoogleログインボタンを配置 <form method="POST" action="{{ route('login') }}"> /* 省略 */ </form> <a href="auth/google">Googleログイン</a> // 追加この状態で「localhost:8080/login」にアクセスすると、
アンカーリンクを表示しているだけなので位置はおかしいですが、
「Googleログイン」ボタンを押すとGoogleのログイン画面にリダイレクトします。*「Word Container」の部分が、GCPで認証情報の設定をした際に入力した名前です。
あとはログインしたいユーザーでログインすれば、
DBにGoogleアカウントの情報が入ります。mysql> select * from users; +----+--------------+--------------------+-------------------+------------------+----------------+---------------------+---------------------+ | id | name | email | email_verified_at | password | remember_token | created_at | updated_at | +----+--------------+--------------------+-------------------+------------------+----------------+---------------------+---------------------+ | 1 | ○○○○○ | xxxxxxx@gmail.com | NULL | ZabdYEZPWOKeIpbp | NULL | 2019-07-02 23:15:15 | 2019-07-02 23:15:15 | +----+--------------+--------------------+-------------------+------------------+----------------+---------------------+---------------------+最後に
今回はGoogleログインでしたが、
SocialiteではFacebook、Twitterはじめ他にもサポートしているサービスがいくつかあるようです。
他のサービスでのログインも併用したい場合にはusersテーブルの構成を少し変える必要がありそうです。
(ex. GoogleとFacebookで同じメールアドレスを登録している可能性があるので)典型的なフォームベースの認証に付け加え、LaravelはLaravel Socialite(=名士)による、OAuthプロバイダによるシンプルで便利な認証方法も提供しています。Socialiteは現在、Facebook、Twitter、LinkedIn、Google、GitHub、GitLab、Bitbucketによる認証をサポートしています。
https://readouble.com/laravel/5.8/ja/socialite.html
参考
- 投稿日:2019-07-04T19:05:34+09:00
LaravelでStorageを使ったファイルおよびディレクトリの操作をまとめてみた
はじめに
Laravelでファイルを取り扱った個人開発を行っている際にファイル保存の方法を調べた際に気になったため、調べてまとめました。
駅に貼られているチラシを見るように流し見していただければ幸いです。Storageとは?
LaravelではFlysystem PHPパッケージによって提供されているファイルシステムを抽象化させたものを使えるように設定されている。
設定ファイルはconofig/filesystems.phpにあり、環境によって保存先のディレクトリが分けられている。らしい。 (引用:参考文献1)今回はそんな
Storageを使ったファイルおよびディレクトリの操作方法をまとめてみる。基本的な書式
StorageはFacadesを拡張して使われるもの。
なので書式は基本的にStorage::◯◯('hoge', 'fuga');になる。
ファイル関連
ファイル保存
Storage::put
Storage::put('file_name', $file);で
$fileを'file_name'という名前で保存することができます。Storage::putFile
Storage::putFile('dir', $file);で
$fileを'dir'に保存することができます。Storage::putFileでは
ファイル名は自動で設定されます。
また、Storage::putFile('dir', $file, 'public');とすることで
$fileを一般公開したいという意思を伝えることができます。Storage::putFileAs
Storage::putFileAs('dir', $file, 'file_name');で
$fileを'dir'に'file_name'という名前で保存することができます。Storage::putFileAsでは自分でファイル名は設定することができます。ファイル書き込み
Storage::prepend
Storage::prepend('file_name', 'hogegeeeee');で
file_nameの先頭にhogegeeeeeを書き込むことができます。Storage::append
Storage::append('file_name', 'fugagaaaaaa');で
file_nameの末尾にfugagaaaaaaを書き込むことができます。ファイルのコピー
Storage::copy
Storage::copy('old dir/file_name', 'new dir/file_name');で
old dirにあるfile_nameをnew dirにコピーすることができます。ファイルの移動
Storage::move
Storage::move('old dir/file_name', 'new dir/file_name');で
old dirにあるfile_nameをnew dirに移動することができます。
また、Storage::move('file_name', 'new_file_name');で
file_nameの名前をnew_file_nameに変更できます。ファイル削除
Storage::move
Storage::delete('file_name');で
file_nameを削除することができます。
また、Storage::delete(['file_name', 'file_name2']);で
file_nameとfile_name2を削除することができます。ディレクトリ関連
ディレクトリ内の全ファイルを取得
Storage::files
Storage::files('dir');で
dirの中の全ファイルを配列で返すことができます。Storage::allFiles
Storage::allFiles('dir');で
dirの中のサブディレクトリの中も含めた全ファイルを配列で返すことができます。ディレクトリ内の全ディレクトリを取得
Storage::directories
Storage::directories('dir');で
dirの中の全ディレクトリを配列で返すことができます。Storage::allFiles
Storage:: allDirectories('dir');で
dirの中のサブディレクトリの中も含めた全ディレクトリを配列で返すことができます。ディレクトリ作成
Storage:makeDirectory
Storage:makeDirectory('dir');で
dirという名前のディレクトリを作成することができます。ディレクトリ削除
Storage:deleteDirectory
Storage:deleteDirectory('dir');で
dirという名前のディレクトリを削除することができます。終わりに
今回はStorageを使ったファイルおよびディレクトリ操作についてまとめてみました。
完全に自己満の記事ですが、何かの役に立てれば幸いです。
最後まで見てくれたあなたがだーいすきです。(一度言ってみたかった)
それでは、またどこかで。笑参考文献
- 投稿日:2019-07-04T18:30:58+09:00
かんたんにAWS Cloud9にLaravel開発環境を構築する。
家のマシンのスペックが貧弱なのでCloud9上に環境構築することにしました。
メモとしてQiitaに書き残しておきます。学習が進み次第追記していくかもしれません。PHPのインストール
# パッケージ更新 sudo yum update -y # phpのバージョン確認 rpm -qa | grep php # php5.6を一式アンインストール sudo yum remove php56* # PHP7.3を一式インストール sudo yum install php73* # リンク削除 -> 貼り直し sudo unlink /usr/bin/php sudo ln -s /etc/alternatives/php7 /usr/bin/phpcomposerのインストール
# インストーラーのダウンロードと実行 curl -sS https://getcomposer.org/installer | php # パスの通った場所へ移動 mv composer.phar /usr/local/bin/composerLaravelのセットアップ
# Laravelのインストール composer global require "laravel/installer" # Laravelプロジェクトの作成 composer create-project --prefer-dist laravel/laravel myappローカルサーバーが動いているか確認
# ポート8080でサーバー起動 php artisan serve --port=8080Previewボタン -> PreviewRunningApplicationから確認できます。
参考URL
AWS Cloud9(Amazon Linux)にPHP7.3をインストールして開発環境を作る手順書
Composerをインストールしてみた
Laravel 5.8 インストール
- 投稿日:2019-07-04T17:01:29+09:00
Laravel5.8 Goodby CSV を使ってCSVダウンロード処理を実装
LaravelとGoodby CSVを使って、CSV出力をする処理を実装する機会があったので内容をまとめたいと思います。
Goodby CSVとは
Goodby CSVは、PHP5.3以降で使用できるメモリ効率が高く、柔軟で拡張可能なオープンソースのCSVインポート/エクスポートライブラリです。
また、SJIS-win, EUC-JP や UTF-8等の文字コードにも対応してます。@suin さんと @reoring さんが作ったライブラリに感謝です???
GitHubはこちら ⭐️ goodby/csv ⭐️環境
- PHP 7.3.6
- Laravel 5.8.27
- MySQL 8.0.16
※新しくLaravelプロジェクトをインストールしてマイグレーション実行まで済ませた状態から始めています。
Goodby CSV インストール
$ composer require goodby/csvCSVダウンローダサービスクラスを実装
app/Services/CsvDownloader.phpを新しく作成します。<?php namespace App\Services; use App\User; use Goodby\CSV\Export\Standard\Exporter; use Goodby\CSV\Export\Standard\ExporterConfig; use Illuminate\Database\Eloquent\Collection; use Symfony\Component\HttpFoundation\StreamedResponse; final class CsvDownloader { /** * @return StreamedResponse */ public function download(): StreamedResponse { $callback = function () { $config = new ExporterConfig(); $config ->setDelimiter(',') // 区切り文字 ->setEnclosure('"') // 囲み文字 ->setEscape('\\') // エスケープ文字 ->setToCharset(null) // 出力ファイルの文字コード ->setFromCharset('auto') // 読み込み元の文字コード ->setColumnHeaders($this->makeCsvHeader()); // CSVの1列目のヘッダー行 $exporter = new Exporter($config); $exporter->export('php://output', $this->makeCsvBody()); }; return response()->streamDownload($callback, $this->makeFilename(), $this->makeResponseHeader()); } /** * @return array */ private function makeCsvHeader(): array { return ['名前', 'メールアドレス', '作成日']; } /** * @return array */ private function makeCsvBody(): array { $users = $this->getUsers(); $data = []; foreach ($users as $user) { $data[] = $this->toCsvFromUser($user); } return $data; } /** * @param User $user * @return array */ private function toCsvFromUser(User $user): array { return [ $user->name, $user->email, $user->created_at, ]; } /** * @return Collection */ private function getUsers(): Collection { return User::all(); } /** * @return array */ private function makeResponseHeader(): array { return [ 'Content-type' => 'text/csv', 'Pragma' => 'no-cache', 'Cache-Control' => 'must-revalidate, post-check=0, pre-check=0', 'Expires' => '0', ]; } /** * @return string */ private function makeFilename(): string { return 'ユーザー一覧.csv'; } }補足
長いコードになっちゃいましたが、Goodby CSVを使用してる箇所はここです。
$config = new ExporterConfig(); $config ->setDelimiter(',') // 区切り文字 ->setEnclosure('"') // 囲み文字 ->setEscape('\\') // エスケープ文字 ->setToCharset(null) // 出力ファイルの文字コード ->setFromCharset('auto') // 読み込み元の文字コード ->setColumnHeaders($this->makeCsvHeader()); // CSVの1列目のヘッダー行 $exporter = new Exporter($config); $exporter->export('php://output', $this->makeCsvBody());出力設定は
ExporterConfigクラスで行います。
CSVの1行目のヘッダー行(setColumnHeaders)の設定以外はデフォルト値を使用してます。
お好みでカスタマイズしてご使用ください。また、README.mdに書かれてあった配列からエクスポートする方法を使用してます。
ファイルダウンロード(ストリームダウンロード)
出力するCSVをディスクに書き込ませず、文字列レスポンス通してダウンロードさせたい場合は
streamDownloadメソッドを使用します。ルーティング定義
routes/web.phpへ下記のルーティングを追記します。Route::get('/users', 'UsersController@index'); Route::get('/users/download', 'UsersController@download');コントローラを作成
src/app/Http/Controllers/UsersController.phpを新たに作成します。<?php namespace App\Http\Controllers; use App\User; use App\Services\CsvDownloader; use Illuminate\Http\Request; use Symfony\Component\HttpFoundation\StreamedResponse; class UsersController extends Controller { /** * @return array */ public function index(): array { $users = User::all(); return [ 'users' => $users, ]; } /** * @return StreamedResponse */ public function download(): StreamedResponse { return (new CsvDownloader())->download(); } }テスト用のユーザーを作成
$ php artisan tinker >>> factory(App\User::class, 10)->create();モデルファクトリーを使って、10件のテストデータを作成します。
動作確認
ユーザー一覧がjsonで返ってきてます。
コントローラで配列を返すとLaravel側でjsonによしなに変換してくれるので確認するときは便利ですね?話は全然変わりますが、 JSON Formatter 入れてると便利です。
実際にダウンロードされたファイルです。
さいごに
Laravel と Goodby CSV で簡単にCSV出力処理を実装できました!
- 投稿日:2019-07-04T17:01:29+09:00
Laravel5.8 Goodby CSV を使ってCSVファイルダウンロードを実装
LaravelとGoodby CSVを使って、CSV出力をする処理を実装する機会があったので内容をまとめたいと思います。
Goodby CSVとは
Goodby CSVは、PHP5.3以降で使用できるメモリ効率が高く、柔軟で拡張可能なオープンソースのCSVインポート/エクスポートライブラリです。
また、SJIS-win, EUC-JP や UTF-8等の文字コードにも対応してます。@suin さんと @reoring さんが作ったライブラリに感謝です???
GitHubはこちら ⭐️ goodby/csv ⭐️環境
- PHP 7.3.6
- Laravel 5.8.27
- MySQL 8.0.16
※新しくLaravelプロジェクトをインストールしてマイグレーション実行まで済ませた状態から始めています。
Goodby CSV インストール
$ composer require goodby/csvCSVダウンローダサービスクラスを実装
app/Services/CsvDownloader.phpを新しく作成します。<?php namespace App\Services; use App\User; use Goodby\CSV\Export\Standard\Exporter; use Goodby\CSV\Export\Standard\ExporterConfig; use Illuminate\Database\Eloquent\Collection; use Symfony\Component\HttpFoundation\StreamedResponse; final class CsvDownloader { /** * @return StreamedResponse */ public function download(): StreamedResponse { $callback = function () { $config = new ExporterConfig(); $config ->setDelimiter(',') // 区切り文字 ->setEnclosure('"') // 囲み文字 ->setEscape('\\') // エスケープ文字 ->setToCharset(null) // 出力ファイルの文字コード ->setFromCharset('auto') // 読み込み元の文字コード ->setColumnHeaders($this->makeCsvHeader()); // CSVの1列目のヘッダー行 $exporter = new Exporter($config); $exporter->export('php://output', $this->makeCsvBody()); }; return response()->streamDownload($callback, $this->makeFilename(), $this->makeResponseHeader()); } /** * @return array */ private function makeCsvHeader(): array { return ['名前', 'メールアドレス', '作成日']; } /** * @return array */ private function makeCsvBody(): array { $users = $this->getUsers(); $data = []; foreach ($users as $user) { $data[] = $this->toCsvFromUser($user); } return $data; } /** * @param User $user * @return array */ private function toCsvFromUser(User $user): array { return [ $user->name, $user->email, $user->created_at, ]; } /** * @return Collection */ private function getUsers(): Collection { return User::all(); } /** * @return array */ private function makeResponseHeader(): array { return [ 'Content-type' => 'text/csv', 'Cache-Control' => 'must-revalidate, no-cache', 'Expires' => '0', ]; } /** * @return string */ private function makeFilename(): string { return 'ユーザー一覧.csv'; } }補足
長いコードになっちゃいましたが、Goodby CSVを使用してる箇所はここです。
$config = new ExporterConfig(); $config ->setDelimiter(',') // 区切り文字 ->setEnclosure('"') // 囲み文字 ->setEscape('\\') // エスケープ文字 ->setToCharset(null) // 出力ファイルの文字コード ->setFromCharset('auto') // 読み込み元の文字コード ->setColumnHeaders($this->makeCsvHeader()); // CSVの1列目のヘッダー行 $exporter = new Exporter($config); $exporter->export('php://output', $this->makeCsvBody());出力設定は
ExporterConfigクラスで行います。
CSVの1行目のヘッダー行(setColumnHeaders)の設定以外はデフォルト値を使用してます。
お好みでカスタマイズしてご使用ください。また、README.mdに書かれてあった配列からエクスポートする方法を使用してます。
ファイルダウンロード(ストリームダウンロード)
出力するCSVをディスクに書き込ませず、文字列レスポンス通してダウンロードさせたい場合は
streamDownloadメソッドを使用します。ルーティング定義
routes/web.phpへ下記のルーティングを追記します。Route::get('/users', 'UsersController@index'); Route::get('/users/download', 'UsersController@download');コントローラを作成
src/app/Http/Controllers/UsersController.phpを新たに作成します。<?php namespace App\Http\Controllers; use App\User; use App\Services\CsvDownloader; use Illuminate\Http\Request; use Symfony\Component\HttpFoundation\StreamedResponse; class UsersController extends Controller { /** * @return array */ public function index(): array { $users = User::all(); return [ 'users' => $users, ]; } /** * @return StreamedResponse */ public function download(): StreamedResponse { return (new CsvDownloader())->download(); } }テスト用のユーザーを作成
$ php artisan tinker >>> factory(App\User::class, 10)->create();モデルファクトリーを使って、10件のテストデータを作成します。
動作確認
ユーザー一覧がjsonで返ってきてます。
コントローラで配列を返すとLaravel側でjsonによしなに変換してくれるので確認するときは便利ですね?話は全然変わりますが、 JSON Formatter 入れてると便利です。
実際にダウンロードされたファイルです。
さいごに
Laravel と Goodby CSV で簡単にCSV出力処理を実装できました!
- 投稿日:2019-07-04T13:54:50+09:00
Laravel MixのIE11対応
LaravelMixのextensionにlaravel-mix-polyfilltというものがあり、簡単に使えたので書いておきます。
https://laravel-mix.com/extensions/polyfill
laravel-mix-polyfillのインストール
npm install laravel-mix-polyfill --save-devlaravel-mix-polyfillを使うための設定
let mix = require('laravel-mix'); require('laravel-mix-polyfill'); mix.js('resources/js/app.js', 'public/js') .sass('resources/sass/app.scss', 'public/css') .polyfill({ enabled: true, useBuiltIns: "usage", targets: {"firefox": "50", "ie": 11} });
- 投稿日:2019-07-04T13:53:35+09:00
N代の人の誕生日の期間を求める
いつ使う
N代の年齢の人を抽出したいが、テーブルには誕生日カラムしかない時に。
コード
$min_age = $generation; // 年代 $max_age = $min_age + 9; $toDay = Carbon::today(); $y = $toDay->year - $max_age - 1; $d = $toDay->day + 1; $startDay = Carbon::parse("{$y}-{$toDay->month}-{$d}"); $y = $toDay->year - $min_age; $endDay = Carbon::parse("{$y}-{$toDay->month}-{$toDay->day}"); $user->whereBetween('birthday', [$startDay, $endDay]); // laravelならこんな感じに。おわり
ちょくちょく使うのでメモです。
年齢をDBの方で持つべきだと思います。
ままならない。
- 投稿日:2019-07-04T11:16:32+09:00
LaravelでSeederを個別に実行する
php artisan db:seed --class={Seederクラス名}







