- 投稿日:2020-11-22T23:46:03+09:00
【Laravel】Carbon まとめ
laravelでサービスを作る上で日時操作をする機会が多かったので、よく使っているメソッドなどをまとめました。
Carbonクラス
CarbonクラスはDateTimeクラスから継承された日付操作ライブラリ。
Laravelには標準搭載されている使用方法
use Carbon\Carbon;の宣言をすることで簡単に使用できる。
取得方法
$date = new Carbon();//インスタンス作成使用用途によって文字列を入れてインスタンス化可能
//ex)now:2020-01-01 12:23:34:121212 new Carbon('now'); //2020-01-01 12:23:34:121212 new Carbon('today'); //2020-01-01 00:00:00:000000 new Carbon('tomorrow'); //2020-01-02 00:00:00:000000 new Carbon('yesterday'); //2019-12-31 00:00:00:000000 //時を進めることも可能 new Carbon('+10 minutes'); //2020-01-11 12:33:34:121212 new Carbon('+10 day'); //2020-01-11 12:23:34:121212 //スタティック $date = Carbon::now(); /2020-01-01 12:23:34:121212インスタンスより欲しい日時を取得
$date = Carbon::now(); $date->year; // 2020 $date->month; // 1 $date->day; // 1 $date->hour; // 12 $date->minute; // 23 $date->second; //34出力フォーマット変更
$date->format('Y年m月d日h時i分s秒')//2020年1月1日12時23分34秒 //時間はhで12時間表示、Hで24時間表示差分を計算
$date1 = new Carbon('2020-01-01'); $date2 = new Carbon('2020-12-25'); // 分 $dt1->diffInMinutes($dt2); // 516960分 // 時間 $dt1->diffInHours($dt2); // 8616時間 // 日 $dt1->diffInDays($dt2); // 359日 // 週 $dt1->diffInWeeks($dt2); // 51週 // 年 $dt1->diffInYears($dt2); // 0年参考文献
- 投稿日:2020-11-22T22:44:49+09:00
【簡単すぎる】Laravel+Vueで星評価機能を実装してみた
背景
- Laravelで星評価機能を実装する必要があった
- Vueの既存ライブラリ「vue-star-rating」を活用すると楽に実装出来そうだったので、やってみた
やり方
ターミナルで以下をそれぞれ実行
npm install vue npm install vue-star-ratingjsファイルに追記
resources/js/app.jsimport StarRating from 'vue-star-rating' Vue.component('star-rating', StarRating); const app = new Vue({ el: '#star', data: { rating: 0 } });ターミナルで以下を実行
npm run dev
→これで、
<star-rating>
タグを利用可能になります。ブレードで星表示
<div id="star"> <star-rating v-model="rating"></star-rating> </div>→これで星が表示されるはずです。
星のサイズなどの調整は以下を参考にすればできると思います。
参考
https://github.com/craigh411/vue-star-rating
https://jsfiddle.net/craig_h_411/992o7cq5/
https://www.kabanoki.net/4632/
- 投稿日:2020-11-22T21:31:31+09:00
File uploading with CKEditor on Laravel-Admin
Install CKEditor on Laravel-admin
At first, install CKEditor on laravel-admin follow the steps below.
https://github.com/laravel-admin-extensions/ckeditorAdding file upload function on CKEditor
config/admin.php... 'ckeditor' => [ 'enable' => true, 'config' => [ 'filebrowserImageUploadUrl' => '/admin/fileupload', // Add here ] ] ...Another options here.
app/Admin/routes.phpuse Illuminate\Routing\Router; Admin::routes(); Route::group([ 'prefix' => config('admin.route.prefix'), 'namespace' => config('admin.route.namespace'), 'middleware' => config('admin.route.middleware'), 'as' => config('admin.route.prefix') . '.', ], function (Router $router) { $router->get('/', 'HomeController@index')->name('home'); $router->post('/fileupload', 'FileuploadController@index'); // Add here ... });app/Http/Middleware/VerifyCsrfToken.php<?php namespace App\Http\Middleware; use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware; class VerifyCsrfToken extends Middleware { /** * The URIs that should be excluded from CSRF verification. * * @var array */ protected $except = [ '/admin/fileupload', // Add here ]; }app/Admin/Controllers/FileuploadController.php<?php namespace App\Admin\Controllers; use App\Http\Controllers\Controller; use Illuminate\Http\Request; class FileUploadController extends Controller { public function index(Request $request) { $image = $request->file('upload'); $name = substr(str_shuffle('1234567890abcdefghijklmnopqrstuvwxyz'), 0, 12); $extension = $image->getClientOriginalExtension(); $newname = $name . '.' . $extension; // you can change third variable as filesystem you want. $image->storeAs([ANY_DIRECTORY_YOUWANT], $newname, 'public'); $url = [YOUR_PUBLIC_PATH] .$newname; $param = [ 'uploaded' => 1, 'fileName' => $newname, 'url' => $url ]; return response()->json($param, 200); } }
- 投稿日:2020-11-22T17:23:51+09:00
php artisan migrate:refresh --seedしてSQLSTATE[21S01]のエラー
前置き
Webを検索しても解決方法が見つかりづらかったので、備忘のために記録します。
動作環境
php 7.4
laravel 6.0
mysql 8.0状況
php artisan migrate:refresh --seed
を実行したときに、
Illuminate\Database\QueryException : SQLSTATE[21S01]: Insert value list does not match column list: 1136 Column count doesn't match value count
というエラーが出た。原因
原因はseederファイルで作成したカラムの数が違っていることでした。
php artisan migrate:refresh --seed
でサンプルデータを作る場合、サンプルのデータをコメントアウトしたり追加したりすると、このようなエラーが発生してしまうということです。対策
シーダーファイルの書き方を変えればコメントアウトした場合でもエラーが出ないようにすることが出来た。以下、その方法を書きます。
以下のような書き方をすると、レコードの一部のカラムをコメントアウトや追加した場合に、上記のエラーが発生してしまいます。
<?php use Illuminate\Database\Seeder; class PropertiesTableSeeder extends Seeder { public function run() { DB::table('テーブル名')->insert([ ['name' => 'だんご', 'project_id' => 1, 'maker_name' => '鈴木商店', 'product_type' => '食品' ], ['name' => 'なす', 'project_id' => 2, //'maker_name' => '山田農園', ← このようにコメントアウトするとエラーになる 'product_type' => '食品'], ]);// 上記シーダーファイルで、山田農園をコメントインして以下を実行すると成功。 php artisan migrate:refresh --seed 結果(成功) Database seeding completed successfully. // コメントアウトして以下を実行するとSQLSTATE[21S01]のエラー。 php artisan migrate:refresh --seed 結果(エラー発生) Illuminate\Database\QueryException : SQLSTATE[21S01]: Insert value list does not match column list: 1136 Column count doesn't match value count at row 2解決したコードの例
シーダーで作成するサンプルデータのカラム内容を追加したりコメントアウトする可能性がある場合は、以下のようにDB::table('テーブル名')->insertを分けて書くと、エラーを発生させずに実行することが出来ます。
class PropertiesTableSeeder extends Seeder { public function run() { DB::table('テーブル名')->insert([ ['name' => 'だんご', 'project_id' => 1, 'maker_name' => '鈴木商店', 'product_type' => '食品'], ]); DB::table('テーブル名')->insert([ ['name' => 'なす', 'project_id' => 2, //'maker_name' => '山田農園', 'product_type' => '食品' ], ]); } }DB::table('テーブル名')->insertをレコードごとに分けて実行するだけです。つまり、DB::table('テーブル名')->insertの行を一回しか書きたくない場合は、作成したいサンプルのカラム数を全て合わせる」ということですね。
// シーダーファイルで、コメントインしようがアウトしようがエラーは発生しません。 php artisan migrate:refresh --seed 結果 Database seeding completed successfully.感想
ベテランの人たちはどんな書き方ややり方でやっているのか知りたいです。カラム数が100個くらいあるテーブルだとシーダーファイルでサンプルを作ると大変ですし。
- 投稿日:2020-11-22T15:21:42+09:00
Laravel:SQLSTATE[42000]: Syntax error or access violation...bytesの解決
【概要】
1.結論
5.参考URL
6.開発環境
1.結論
app/Providers/AppServiceProvider
のpublic function boot()
にSchema::defaultStringLength(191);
を記載する!2.SQLSTATE[42000]とは何か
アクセス違反ですという意味で、SQL文の文法に誤りがあるということです。ただ、それに起因してデータがパンパンになっているためこのエラーになっています。
3.なぜこのエラーになったのか
結論から言いますとLaravelとMysqlのバージョンのせいで、Mysqlのカラムや中身の文字列がデータ量(767bytesがMAX)を超えたからでした。UTF8MB4になり1文字あたりのデータ量(4bytes)が増えたからのようです。
(大変参考になったURLを下記(参考URL)に添付しています。)4.どのように解決したのか
app/Providers/AppServiceProvideruse Illuminate\Support\Facades\Schema; //⬅︎を追加記載(❶) use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider { // 省略 public function boot() { Schema::defaultStringLength(191); //⬅︎を追加記載(❷) } }4bytes*191文字=764bytesに抑えることで、規定量以下にしました。これをデフォルト設定にしているのでどのテーブルにもこれが適用されます。Mysqlのバージョンアップもありましたが、手軽かつアプリを使用する際に100文字を超える実装はなかったので今回はこの手段を取りました。また❶を記載しないとエラーが起きます。
5.参考URL
①Laravel5.4以上、MySQL5.7.7未満 でusersテーブルのマイグレーションを実行すると Syntax error が発生する
②【Laravel】migrateでテーブルが存在したらスキップする6.開発環境
PHP 7.4.10
Laravel 8.9.0
MySQL 5.6.47/SequelPro 1.1.2
- 投稿日:2020-11-22T15:21:42+09:00
Laravel:SQLSTATE[42000]Syntax error or access violation...bytesの解決
【概要】
1.結論
5.参考URL
6.開発環境
1.結論
app/Providers/AppServiceProvider
のpublic function boot()
にSchema::defaultStringLength(191);
を記載する!2.SQLSTATE[42000]とは何か
アクセス違反ですという意味で、SQL文の文法に誤りがあるということです。ただ、それに起因してデータがパンパンになっているためこのエラーになっています。
3.なぜこのエラーになったのか
結論から言いますとLaravelとMysqlのバージョンのせいで、Mysqlのカラムや中身の文字列がデータ量(767bytesがMAX)を超えたからでした。UTF8MB4になり1文字あたりのデータ量(4bytes)が増えたからのようです。
(大変参考になったURLを下記(参考URL)に添付しています。)4.どのように解決したのか
app/Providers/AppServiceProvideruse Illuminate\Support\Facades\Schema; //⬅︎を追加記載(❶) use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider { // 省略 public function boot() { Schema::defaultStringLength(191); //⬅︎を追加記載(❷) } }4bytes*191文字=764bytesに抑えることで、規定量以下にしました。これをデフォルト設定にしているのでどのテーブルにもこれが適用されます。Mysqlのバージョンアップもありましたが、手軽かつアプリを使用する際に100文字を超える実装はなかったので今回はこの手段を取りました。また❶を記載しないとエラーが起きます。
5.参考URL
①Laravel5.4以上、MySQL5.7.7未満 でusersテーブルのマイグレーションを実行すると Syntax error が発生する
②【Laravel】migrateでテーブルが存在したらスキップする6.開発環境
PHP 7.4.10
Laravel 8.9.0
MySQL 5.6.47/SequelPro 1.1.2
- 投稿日:2020-11-22T04:09:08+09:00
LaravelのEloquentで、グループごとに日付が最新の行を取得したいときのテク
たとえば、サロンの予約テーブルがあるとしたら、
ユーザーごとに日付が最新の予約だけを取得したいときに使えるテク。前提
// NGな例 $reservations = Reservation ::groupBy('user_id') ->selectRaw('user_id, max(visit_salon_time)') ->get();みたいな感じで良さそうだが、これだと
user_id
とvisit_salon_time
しか取得できない。
集計が効かないカラムの取得には工夫が必要。具体的な方法
別の書き方は複数存在するが、以下のコードはサブクエリが不要でシンプル。
$reservations = Reservation ::leftJoin( 'reservations as reservations2', function ($join) { $join->on('reservations.user_id', 'reservations2.user_id') ->whereColumn('reservations.visit_salon_time', '<', 'reservations2.visit_salon_time'); } ) ->whereNull('reservations2.user_id') ->get();ざっくり解説
同じテーブルを条件付きで
leftJoin
して、日付が最新の行はJoin
されないようにする。
Join
されたテーブルのいずれかのカラムがNull
であれば最新。