20201122のlaravelに関する記事は7件です。

【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年

参考文献

公式サイト https://carbon.nesbot.com/

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【簡単すぎる】Laravel+Vueで星評価機能を実装してみた

背景

  • Laravelで星評価機能を実装する必要があった
  • Vueの既存ライブラリ「vue-star-rating」を活用すると楽に実装出来そうだったので、やってみた

やり方

ターミナルで以下をそれぞれ実行

npm install vue
npm install vue-star-rating

jsファイルに追記

resources/js/app.js
import 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/

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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/ckeditor

Adding file upload function on CKEditor

config/admin.php
...
        'ckeditor' => [
            'enable' => true,
            'config' => [
                'filebrowserImageUploadUrl' => '/admin/fileupload', // Add here
            ]   
        ]   
...

Another options here.

app/Admin/routes.php
use 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); 
    }   
}

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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個くらいあるテーブルだとシーダーファイルでサンプルを作ると大変ですし。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel:SQLSTATE[42000]: Syntax error or access violation...bytesの解決

【概要】

1.結論

2.SQLSTATE[42000]とは何か

3.なぜこのエラーになったのか

4.どのように解決したのか

5.参考URL

6.開発環境

1.結論

app/Providers/AppServiceProviderpublic function boot()Schema::defaultStringLength(191);を記載する!

2.SQLSTATE[42000]とは何か

アクセス違反ですという意味で、SQL文の文法に誤りがあるということです。ただ、それに起因してデータがパンパンになっているためこのエラーになっています。

3.なぜこのエラーになったのか

結論から言いますとLaravelとMysqlのバージョンのせいで、Mysqlのカラムや中身の文字列がデータ量(767bytesがMAX)を超えたからでした。UTF8MB4になり1文字あたりのデータ量(4bytes)が増えたからのようです。
(大変参考になったURLを下記(参考URL)に添付しています。)

4.どのように解決したのか

app/Providers/AppServiceProvider
use 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

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel:SQLSTATE[42000]Syntax error or access violation...bytesの解決

【概要】

1.結論

2.SQLSTATE[42000]とは何か

3.なぜこのエラーになったのか

4.どのように解決したのか

5.参考URL

6.開発環境

1.結論

app/Providers/AppServiceProviderpublic function boot()Schema::defaultStringLength(191);を記載する!

2.SQLSTATE[42000]とは何か

アクセス違反ですという意味で、SQL文の文法に誤りがあるということです。ただ、それに起因してデータがパンパンになっているためこのエラーになっています。

3.なぜこのエラーになったのか

結論から言いますとLaravelとMysqlのバージョンのせいで、Mysqlのカラムや中身の文字列がデータ量(767bytesがMAX)を超えたからでした。UTF8MB4になり1文字あたりのデータ量(4bytes)が増えたからのようです。
(大変参考になったURLを下記(参考URL)に添付しています。)

4.どのように解決したのか

app/Providers/AppServiceProvider
use 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

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

LaravelのEloquentで、グループごとに日付が最新の行を取得したいときのテク

たとえば、サロンの予約テーブルがあるとしたら、
ユーザーごとに日付が最新の予約だけを取得したいときに使えるテク。

前提

// NGな例
$reservations = Reservation
    ::groupBy('user_id')
    ->selectRaw('user_id, max(visit_salon_time)')
    ->get();

みたいな感じで良さそうだが、これだとuser_idvisit_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であれば最新。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む