カテゴリー: フレームワーク

  • 【Laravel】General error: 1 no such column: ${table_name}.

    【Laravel】General error: 1 no such column: ${table_name}.

    とあるLaravel 11のプロジェクトで、下記のエラーが発生した。

    Next Illuminate\Database\QueryException: SQLSTATE[HY000]: General error: 1 no such column: email_activation_tokens. (Connection: sqlite, SQL: select * from "email_activation_tokens" where "email_activation_tokens"."" is null limit 1) in /home/laravel/app/vendor/laravel/framework/src/Illuminate/Database/Connection.php:822

    このエラーは、Laravelのよくあるようなメール送信機能を実装していて、メール送信を非同期で行うために処理をジョブ化して、メール送信をキュー処理できるようにしていて、それをPHPUnit経由で実行した際に上記のエラーが発生したという次第である。

    エラーの内容としては、存在しないカラムを参照している事が問題との事だが、自分で書いたコードで該当するカラムを参照しようとする箇所は無いので、Laravel側のコードのどこかで何かが起こっているのだろうという感じ。

    関係している処理を一通り調べたところ、メール送信のためのジョブにEloquentのインスタンスを保持させようとすると、このエラーが発生している事が分かった。

    General error: 1 no such column: email_activation_tokens.

    というエラーであるが、email_activation_tokensというのはテーブル名であり、カラムとして参照とするコードは一切ないので、Laravel側のどこかで問題が発生しているようだ。

    ちなみにモデルのフィールドを下記のようにすると、エラーが発生するようになって、下記のフィールドを消してしまえば正常に動くのだが、テーブルの設計の関係で下記のようにする必要がある。

    protected $primaryKey = null;
    
    public $incrementing = false;
    
    const UPDATED_AT = null;

    そのため、ジョブにEloquentのインスタンスを渡すのではなく、toArrayメソッドでモデルの情報を配列にしてみると、エラーは発生しなくなった。