0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

LaravelのcommandでUser以外のDBデータをEloquentで取り出せない件

Posted at

TL;DR

Laravelは便利なもので、php artisan hogehoge ってコマンドを簡単に作れます。
これを利用して定期実行させたりもできて使っているのですが、、

User以外のmodel呼び出しでeloqunet使えない!!!

結局、インジェクションのリスクが少ない箇所だったので、直接SQL叩いて解決しました。DB::select(DB::raw())

症例

例えば

app/Console/Commands/HogeCommand.php

    public function handle()
    {
        $users=User::get();
        //色々な処理
        return Command::SUCCESS;
    }

これは出来るわけです。

でも、このユーザーに紐付いた日記テーブル(diaries)から値を取ろうとすると

    public function handle()
    {
        $users=User::get();
        $diaries=Diary::get();
        //色々な処理
        return Command::SUCCESS;
    }

ここでの$diariesは空のオブジェクトになります。
もちろんデータは入っていまして、Controllerとかで呼び出す分には正しく動きます。

    public function handle()
    {
        $users=User::with('diaries')->get();
        //色々な処理
        return Command::SUCCESS;
    }

withを使って呼び出してもdiariesの情報は手に入りません……空になります。

エラーも出ていないのが厄介なところです。

考察

Laravel素人なので詳しいことは分かりませんが。WordPressのテーマ制作に似たような症例があります。

functions.phpにおいて記事の情報(タイトルやACFのget_fieldなど)は引っ張ってこれるがカテゴリなどのタクソノミーの情報(get_termsなど)は引っ張ってこれない。

これと同じく、command実行時点ではuser以外のmodel情報はまだ読み込まれていないのかもしれません。

一時的な解決策

SQLの直打ち

SQLインジェクションの危険があるため、お気をつけてください。
commandでの利用だとそこまで危険性がないので、私はこの方法を取りました。


 $counter=DB::select(DB::raw("select count(*) as counter from ".$table." where user_id=".$user_id));

原点回帰という訳です。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?