質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Eloquent

Eloquentとは、PHPフレームワークのLaravelに最初から含まれているORM(Object-relational mapping:オブジェクト関係マッピング)です。

Q&A

解決済

1回答

19859閲覧

Laravel Eloquent で query()メソッドを使うとCall to undefined method

toitoitoi

総合スコア28

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Eloquent

Eloquentとは、PHPフレームワークのLaravelに最初から含まれているORM(Object-relational mapping:オブジェクト関係マッピング)です。

0グッド

0クリップ

投稿2019/02/22 03:49

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()の併用ができないということなのでしょうか。
そもそも根本的な使い方が間違えているのでしょうか。

アドバイスをください。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/02/22 03:55

エラーの意味自体は認識済みですか?
toitoitoi

2019/02/22 05:10

「メソッドが定義されていない」程度の認識でした。 with()がないと使えるのにどうしてだろう、と。 with() によってEloquentではなくQueryBuilderが返ってきてる故のエラーメッセージというところまでは理解できていませんでした。 お陰さまでかいけつに至りました。 どうもありがとうございましたm(_ _)m
m.ts10806

2019/02/22 05:12

>「メソッドが定義されていない」程度の認識でした。 確かにそうですが、フレームワークの機能を使う場合は「未定義のメソッド」というよりも「存在しない機能を利用しようとした」「参照を仕方や手順を間違えた」という認識の方が解決に向かいやすくなります。
toitoitoi

2019/02/22 05:18

> 「存在しない機能を利用しようとした」「参照を仕方や手順を間違えた」という認識の方が解決に向かいやすくなります。 今回がまさにこれに該当するのですね。 今後「Undefined」に遭遇したらその認識で見てみようと思います。
guest

回答1

0

ベストアンサー

EloquentはEloquentとQueryBuilderの混在なのでどちらなのかを意識したほうがいい。
StudentはEloquent
withはQueryBuilderを返す。
queryもQueryBuilderを返す。
QueryBuilderにqueryはないのでwith()->queryはできない。

今回の場合は単純にqueryが不要。

$query = Student::with('classes');

もっといいのはwhen使えばまとめて書ける。

$students = Student::with('classes') ->when($student_name, function ($query, $student_name) { return $query->where(); })

https://readouble.com/laravel/5.7/ja/queries.html#conditional-clauses

投稿2019/02/22 04:42

kawax

総合スコア10377

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

toitoitoi

2019/02/22 05:12

Studentsとwith()とで返ってくるものが違うのですね。改めて勉強します。 1つめ、2つめの方法どちらでもうまく動かせました。 2つめの方がスマートだったのでそちらを採用します。 大変わかりやすいご回答をありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問