もがき系プログラマの日常

もがき系エンジニアの勉強したこと、日常のこと、気になっている技術、備忘録などを紹介するブログです。

laravelのエラーClass "Doctrine\DBAL\Driver\AbstractMySQLDriver" not foundがでた

はじめに

こんばんは。

laravelのマイグレーションでカラム変更しようとした際にエラーが出たので、備忘録しておきます。

本題

1

今回試した際に発生したエラーは以下です。

Class "Doctrine\DBAL\Driver\AbstractMySQLDriver" not found

こちらを解決するには、以下のパッケージが必要です。

github.com

下記コマンドでインストールすれば問題なくマイグレーションを実行できます。

$ composer require doctrine/dbal

2

別のマイグレーション実行時に出たエラーでありました。

TINYINTの方を変更しようとした際にエラーが起きました。

調べてみると、tinyintは変更できないみたいです。

readouble.com

Note: 以降のカラムタイプを変更できます。bigInteger、binary、boolean、date、dateTime、dateTimeTz、decimal、integer、json、longText、mediumText、smallInteger、string、text、time、unsignedBigInteger、unsignedInteger、unsignedSmallInteger、uuid。timestampのカラムタイプを変更するには、Doctrineタイプを登録する必要があります。

対処法は ALTER TABLEを直接実行する方法がベターのようです。

DB::statement('ALTER TABLE xxxx CHANGE COLUMN `xxxx` `xxxx` BIGINT UNSIGNED');

調べると結構出てきますが、 laravel8になっても発生していました。

終わりに

かんたんだけど備忘録として残しておきます。

最近laravelばっかりやってますが、別のこともやりたいな。

おわり。

7〜8月のダイエット結果

はじめに

こんばんは。

7〜8月のダイエット結果です。

前回はこちら

kojirooooocks.hatenablog.com

本題

7月、8月は暑いのもあり、疲れたためダイエットが億劫になってきた時期でした。

運動はいつものとおり下記

有酸素運動は FitBoxing

無酸素運動は腹筋ローラー

です。

ただし、先に行ったように億劫になっていたので、 30分やってたボクシングを 20分にしたり、腹筋ローラーも疲れてやらなくなったりしてました。。。

幸運だったのは、ご飯をあんまり食べなくなったので少食になったのか、運動してない日はあんまり食べないというダイエットを行えることができました。

おかげでそこまで運動しなくても体重増加は抑えられました。

ただし、運動しないと落ちませんでした。

なので、8月の終わりに頑張ってボクシングやりまくりまして、8月31日の段階で 66.0kg!!!!

今年の目標では 年末76kgだったみたいなので、ついに -10kgです。

ながかったなぁ。。。

kojirooooocks.hatenablog.com

終わりに

ついに66kgまで来ましたが、まだまだ肥満体型です。 目標は 60kg。

頑張ります!

github action でキャッシュを使う

はじめに

こんばんは。

先週から目眩と頭痛が続いていて体調が悪く死んでおりました。

今回は github action のキャッシュをつかってみたので備忘録として残しておきます。

docs.github.com

本題

本体はこちら

name: Test

on:
  push:
    branches:
      - main

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: shivammathur/setup-php@v2
        with:
          php-version: '8.1'

      - uses: actions/checkout@v3

      - name: Setup ENV
        run: |
          cp .env.example .env

      #### キャッシュのコード
      - name: Get Composer Cache Directory
        id: composer-cache
        uses: actions/cache@v3
        with:
          path: ${{ github.workspace }}/vendor
          key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
          restore-keys: ${{ runner.os }}-composer-
      - name: Install Dependencies
        if: steps.composer-cache.outputs.cache-hit != 'true'
        run: |
          composer install -q --no-ansi --no-interaction --no-scripts --no-progress --prefer-dist
      #### キャッシュのコード

      - name: Execute Test
        run: |
          php artisan key:generate && ./vendor/bin/phpunit

これを使ってまず動かしてみます。

キャッシュが作られてないのでnot foundとなり、後続の composer installが実行されています。

つぎに、適当にファイルを修正して pushしてみます(mainブランチへのpushがトリガーなので動いてくれます)

キャッシュがヒットして後続のcomposer installは実行されていません!

終わりに

phpはこんな感じでできますが、jsもおんなじ要領でできます。

ただ、jsは setup-node でもキャッシュできるみたいです。

個人的には書き方統一したいなと思うので、jsもおんなじように書いちゃいたいです。

こんな感じで終わり。

来週からは体調治るといいな。。。

laravelのページネーションリンクにパラメータを渡す

はじめに

こんばんは。

またまた恥ずかしい話です。

久々に bladeファイル触っていて完全にやり方忘れていたので、備忘録で残しておきます。

本題

めちゃめちゃかんたんですがよくあるページネーションリンクに検索クエリを渡す方法です。

方法は以下。

{{ $users->onEachSide(5)->appends(Request::all())->links() }}

appends() が本体です。

github.com

内部でaddQuery()を実行してくれている感じです。

その後 links()を呼んでるのでページネーションリンクが生成されます。

このlinkで検索クエリがついてくれます。

ちなみにappendsは渡されたデータを内部で保持しているので、よくある管理画面で上下にlinkを表示する場合は、最初に呼ばれる方にだけ appendsを呼べばOKです。

終わりに

めちゃんこかんたんな話になりましたが、恥をかいて覚えていくスタイルなので、これからも恥かきながら進んでいきます。

リレーション先のレコード件数を取得する

はじめに

こんばんは。

今回も恥ずかしくも知らなかった件です。

本題

今までリレーション先のレコード数を確認するのって with() とかで指定してとってきたコレクションをcountしていました。

ただ、laravelでは withCount() ってのを提供していました。

readouble.com

<?php

$team = Team::query()->withCount(['users'])->where('id', $teamId)->firstOrFail();
dd($team->users_count); ← n件

便利なもんですね。。。 また、公式にものってたのですが、 withMin() withMax() withSum() とかよく使う系のものがいっぱいありました。

でもこれって Collectionでもおんなじこと簡単にできますよね??

phpでやるかDBでやるかどっちがいいんだろうと思いました。

結局自分の結論は 件数が多ければ DB 少なければ php という感じにしておきました。

終わりに

他にもいろんな知らないところいっぱいありそうです。。。

恥をかきつつ今日も勉強勉強。

現場からは以上です。

PS.

vue3おもろい

自分でできる子に育つほめ方叱り方を読んだ

はじめに

こんばんは。

今回はこの本を読みました。

最近子育てに妻と自分ともに悩んでいたので、なにかこの状況を打破できるものはないかなと持ってアマゾンでポチりました。

中田のあっちゃんも動画で紹介してました。

www.youtube.com

www.youtube.com

本題

正直動画見れば大体概要わかっちゃうんですが、自分的に特に刺さった3つのことを残しておきます。

1. 叱る前に、自分の期待が子供の発達にふさわしいものか?大人にとって不都合だから叱っていないか?を一度問い直してみましょう。

以下の言葉にとてもギクリとされました。

子供がもっと遊びたいとぐずるとイライラしてしまうのはなぜなのか。すぐに気持ちを切り替えるべきだと、成熟した大人と同じような期待を子供にしていませんか?

最近子供がよく、ぐずるようになってしまって、よく怒ってしまっていました。

怒っては 「怒り過ぎてしまった」と落ち込んでいる事が多かったです。

明日から、ぐずったときに今一度怒ることかどうかを考えたいと思います。

2. 本来子供が求めているのは評価ではなく、何かを達成したとき、新しいことを発見したとき、嬉しいことがあったときに、大好きな両親や先生とそれを共有することなのです。

これも僕は勘違いしていました。

何かをしたときに、当然100%の気持ちですごいねー!できたねー!と伝えていたのですが、本来はそれを求めているわけではなかったんです。

子供が父ちゃん見てみて!と話してきたときは、一度手を止めてしっかり子供の言葉を聞いて、話をしっかり聞いてあげることが大事だというのがわかりました。

3. 普段の自分の接し方がこの子育ての長期的なゴールの妨げになっていないかを一度考えて見る必要があります。

この文をみるまで、長期的なゴールを想像していませんでした。

ざっくり自立した大人になってほしいというくらいです。

ただ、そうだよねと。

育てていく過程で道標もなしに進むのは危険でした。

仕事も同じく、ゴールが見えてないと、どんどん最終的な理想形からズレていっちゃいます。

妻とも一緒に話した部分でした。

終わりに

本当はもっといっぱいまとめようと思ったのですが、中田のあっちゃんの動画が見つかったので、正直まとめることはなかったですw

ただ、共感してもらいたいという部分はとても勉強になりました。

妻との関係でも使えるような事も書いてありました。

今、子育てに悩んでいる人たちにはぜひ読んでほしいです。

laravelでツリー構造のmodelのリレーション

はじめに。

こんばんは。

かんたんですが、ツリー構造を持っているmodelのリレーションを扱うものがあったので、備忘録として残しておきます。

本題

以下のようなテーブルがあるとします。

CREATE TABLE `categories` (
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `parent_id` int DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

今回、自分の子供の件数を取得したいという要件がありまして、 hasMany で取れるのかな?と思ってやってみました。

Model

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Relations\HasMany;

class Category extends Model
{
    public function children(): HasMany
    {
        return $this->hasMany(self::class, 'parent_id', 'id');
    }
}

取得側

<?php

namespace App\Http\Controllers\Actions;

use App\Models\Category;

class GetCategoryAction extends Model
{
    public function __invoke()
    {
        $categories = Category::query()
            ->withCount(['children'])
            ->paginate();

        dd(array_map(static fn(Category $category) => $category->toArray(), $categories->items()));
    }
}

結果は以下のようにとれます。

^ array:2 [▼
  0 => array:3 [▼
    "id" => 1
    "name" => "XXXXXX"
    "children_count" => 1
  ]
  1 => array:3 [▼
    "id" => 2
    "name" => "xxxxx"
    "children_count" => 0
  ]
]

終わりに

循環参照にだけ気をつける必要がありますが、かんたんにこんな事できるの、いいですね。

現場からは以上です。