laravel5.8で開発を行っている者です。
コントローラー内で複数のテーブルの情報を取得するロジックのリファクタリングを行っています。
モデル内にリレーションを張って、計4つのテーブル(Todo,User,Category,Videoモデル)の情報を取得したいのですが、「videoモデル」だけが参照できません。
これまではjoin()を使ってクエリに近い形で4つのテーブル情報を取得していました(リファクタ前のコード参照)。
今度はwithで複数のリレーションを参照する形に変更しました。
hasOne/belongsToの設定はあっていますし、joinで書いたコードだと情報をとって来れるのですが・・・。
一つ思い当たる点として、Videoモデル(Videosテーブル)は、最初に「Fileモデル(Filesテーブル)」という名前で作成、後にVideoにリネームしました。
キャッシュが関係しているのかと思い、
php artisan config:clear
php artisan cache:clear
は試したのですが、解決しませんでした。
リファクタ前(videoの情報を取得できていた)コード
$todos = DB::table('todos') ->join('users', 'todos.user_id', '=', 'users.id') ->join('categories', 'todos.category_id', '=', 'categories.id') ->join('videos', 'todos.id', '=', 'videos.todo_id') ->select('users.name as user_name', 'todos.*', 'categories.name', 'videos.file_path') ->get();
リファクタ後(videoだけ参照できない・エラーが出る)コード
$todos = Todo::with(['user:id,name', 'category:id,name', 'video:id,file_path'])->get();
・withの書き方について
公式リファレンスの「複数のリレーションに対するEagerロード」
Todoモデルのコード
class Todo extends Model { protected $fillable = ['user_id', 'category_id', 'title', 'grade', 'done', 'limit_date']; protected $guarded = []; // 常にtodoをペアになってロードされる。ここに書いてもvideoだけロードされない protected $with = ['category', 'video']; public static function create(array $attributes = []) { $model = new Todo($attributes); $model->save(); return $model; } public function video() { return $this->hasOne('App\Video'); } public function category() { return $this->belongsTo('App\Category'); }
Videoモデル
class Video extends Model { protected $fillable = ['file_path']; public function todo() { return $this->belongsTo('App\Todo'); } }
以上、長々と申しわけありませんが、アドバイスいただけますと幸いです。

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/01/08 23:53