Laravel のコントローラーでDBからの取得処理を書いています。
条件文など一続きで書くと成功するのですが、
$query 変数を使ってif文で分割しようとするとエラーになってしまいます。
■成功するコード
$studens = Student::with('classes') ->where('students.name', 'like', '%'.$student.name'%') ->whereHas('classes', function($query) use ($class_name) { $query->where('name', 'like', '%'.$class_name.'%'); })->get();
■失敗するコード
$query = Student::with('classes')::query(); if($student_name) { $query->where('students.name', 'like', '%'.$student_name.'%'); } if($class_name) { $query->whereHas('classes', function($query) use ($class_name) { $query->where('name', 'like', '%'.$class_name.'%'); }); } $students = $query->get();
冒頭のquery()の部分で下記のエラーが出ます。
Call to undefined method Illuminate\Database\Eloquent\Builder::query()
・query()とwith()の順序を入れ替えてもうまくいきません。
・ただし、::with()を省き、Student::query()とすると当該行は通過できます。
with() と query()の併用ができないということなのでしょうか。
そもそも根本的な使い方が間違えているのでしょうか。
アドバイスをください。
よろしくお願いいたします。
エラーの意味自体は認識済みですか?
「メソッドが定義されていない」程度の認識でした。
with()がないと使えるのにどうしてだろう、と。
with() によってEloquentではなくQueryBuilderが返ってきてる故のエラーメッセージというところまでは理解できていませんでした。
お陰さまでかいけつに至りました。
どうもありがとうございましたm(_ _)m
>「メソッドが定義されていない」程度の認識でした。
確かにそうですが、フレームワークの機能を使う場合は「未定義のメソッド」というよりも「存在しない機能を利用しようとした」「参照を仕方や手順を間違えた」という認識の方が解決に向かいやすくなります。
> 「存在しない機能を利用しようとした」「参照を仕方や手順を間違えた」という認識の方が解決に向かいやすくなります。
今回がまさにこれに該当するのですね。
今後「Undefined」に遭遇したらその認識で見てみようと思います。
回答1件
あなたの回答
tips
プレビュー