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));
原点回帰という訳です。