Googleドライブの仕様が変わっていて「マイドライブ」で同期するローカルフォルダの変更に手間取ったお話
[2023/02/22]
2019/08/07
日付のフォーマットを YYYY-MM-DD から YYYY/MM/DD に変更したい。
モデルのDateフォーマットを↓こんな風に設定しても、うまくいかずエラーになってしまう。(MySQL ・ PostgreSQL ・ SQLite で試してみたけれど変わらず)
protected $dateFormat = 'Y/m/d H:i:s';
画面上の出力形式を変更するには、Eloquentのアクセサ機能を利用する。
function getEndDateAttribute($value)
{
return $value ? Carbon::parse($value)->format('Y年m月d日') : null;
}ほぼ Laravel インストール直後の状態からスタートして、インストール時に生成される users テーブルの CRUD 画面を作ってみます。
(参考:Laravel5.7: usersのCRUD機能を実装する – Qiita)
php artisan migrate
で users テーブルが生成されます。
次にリソースコントローラーを生成。
php artisan make:controller UserController --resource
これで app\Http\Controllers\UserController.php が生成されて、index() や create() なんかのメソッド定義だけが自動的に用意されます。
ルーティングは web.php に
Route::resource('users', 'UserController');と書けば、単純なCRUDについてはOK。
データが空なので、先に簡単な登録画面を作成してしまいましょう。
まずは登録画面を表示させるために、 app\Http\Controllers\UserController.php にて
public function create()
{
return view('users.create');
}としておきます。
ここで指定した “users.create" の 実体(htmlを出力するBladeファイル)として resources\views\users\create.blade.php を作成します。
<div>
<form action="{{ url('users') }}" method='post'>
@csrf
<p>name <input id="name" type="text" name="name"></p>
<p>e-mail <input id="email" type="email" name="email"></p>
<p>password <input id="password" type="password" name="password"></p>
<p>password(confirm) <input id="password_confirmation" type="password" name="password_confirmation"></p>
<p><button type="submit" name="submit">登録</button></p>
</form>
</div>※バリデーションもcssも何もないので良い子はマネしてはいけません。
入力したデータの行先は action="url('users’)" となっていて、php artisan route:list で確認してみます。
>php artisan route:list
+--------+-----------+-------------------+---------------+---------------------------------------------+--------------+
| Domain | Method | URI | Name | Action | Middleware |
+--------+-----------+-------------------+---------------+---------------------------------------------+--------------+
| | GET|HEAD | / | | Closure | web |
| | GET|HEAD | api/user | | Closure | api,auth:api |
| | GET|HEAD | users | users.index | App\Http\Controllers\UserController@index | web |
| | POST | users | users.store | App\Http\Controllers\UserController@store | web |
| | GET|HEAD | users/create | users.create | App\Http\Controllers\UserController@create | web |
| | GET|HEAD | users/{user} | users.show | App\Http\Controllers\UserController@show | web |
| | PUT|PATCH | users/{user} | users.update | App\Http\Controllers\UserController@update | web |
| | DELETE | users/{user} | users.destroy | App\Http\Controllers\UserController@destroy | web |
| | GET|HEAD | users/{user}/edit | users.edit | App\Http\Controllers\UserController@edit | web |
+--------+-----------+-------------------+---------------+---------------------------------------------+--------------+POST の users は App\Http\Controllers\UserController@store ということで、 UserController の store メソッドを実装します。
(リソースコントローラー生成時にメソッド定義だけ自動的に用意されてます。)
public function store(Request $request)
{
$user = new User;
$user->name = $request->name;
$user->email = $request->email;
$user->password = $request->password;
$user->save();
return redirect('users/'. $user->id);
}ついでに、指定されたユーザーを表示する show メソッドを用意しておきましょう。(登録完了時に リダイレクトした先が無いと真っ白画面になってしまうのです。)
public function show(User $user)
{
return view('users.show', ['user' => $user]);
}初期状態では仮引数が型宣言(タイプヒンティングという呼び方はPHP5の時代みたいっすよ)なしで show( $user ) になっていますが、show( User $user ) と型宣言してやることにより、Laravel の「モデル結合ルート」によってモデルを直接やり取りできるようになります。
そして、そのモデルをそのまま view() で Blade に渡してやります。
<div>
<h1>user id : {{ $user->id }}</h1>
<p>name : {{ $user->name }}</p>
<p>e-mail : {{ $user->email }}</p>
</div>さて、動かしてみます。ブラウザで
http://localhost:8000/users/create
にアクセスすると、create.blade.php がレンダリングされます。

適当に値を入れて「登録」ボタンをクリックすると、

無事DBに登録されました。
さて、お次は、created_at と updated_at のカラム属性を変更してマイクロ秒まで持てるようにしてみます。
Laravel インストール時に生成されている users テーブルでは、
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('name');
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
}このように定義されているので、最後の行を
$table->timestamps(6);
としてテーブルを再生成します。(↓データ消えるのでご注意を)
php artisan migrate:refresh
でテーブルが再生成されました。
DBツール(A5:SQL Mk-II 使ってます)で確認すると、
無事、timestamp(6) without time zone となりました。
さて、実はここからが本題なんですが、Laravelの公式ドキュメントには、
タイムスタンプフォーマットをカスタマイズする必要があるなら、モデルの$dateFormatプロパティを設定してください。
と書かれています。
「ほー。スラッシュ区切りにしよっと。」とか思って、
protected $dateFormat = "Y/m/d H:i:s.u";
なんてやってみるんですが、これで上手くいったためしがありません…。
vendor\nesbot\carbon\src\Carbon\Traits\Creator.php#createFromFormatAndTimezone()
辺りで、日付の値と指定フォーマットが違うじゃん、って怒られてエラーになってしまいます。
「2019-09-10 みたいなハイフンじゃなくて、スラッシュ区切りで 2019/09/10 って出したいんじゃい!」という場合は、 protected $dateFormat = で指定するのではなく、Eloquentのアクセサ機能を使って希望の書式を返してやる、ということのようです。
use Carbon\Carbon;
class User extends Authenticatable
{
(略)
public function getUpdatedAtAttribute($value)
{
return Carbon::parse($value)->format("Y/m/d H:i:s.u");
}
}こうしてやることで、

希望通りの書式で表示されるようになりました。

早稲田大学研究室発のロボットベンチャー「Genics」が「CES2019」に出展 ...

超直前予約! 10分後に入れるお店を探せる「Toreta now」は革命かも | ...

WordPressをインストールしてサイト制作。 ルートを汚したくないので、 / ...

事業拡大に伴い再度エンジニア採用すすめるとのことで再募集。ミーティング情報なども ...

こちらの記事の続きです。 フレームワークに頼らず素のPHPでオブジェクト指向を… ...
[2023/02/22]
[2022/01/30]
[2021/03/29]
[2021/03/28]
[2021/02/03]
[2020/08/04]
[2020/06/30]
[2025/01/11]
[2024/11/03]
[2024/08/25]
[2024/07/04]
[2024/06/11]

ディスカッション
コメント一覧
まだ、コメントがありません