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

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

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

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

Q&A

解決済

1回答

1469閲覧

laravel リレーション先での条件絞り込みができない

katase

総合スコア0

Laravel

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

0グッド

0クリップ

投稿2021/08/11 17:23

編集2021/08/11 17:38

前提・実現したいこと

環境
PHP 8.0.5
Laravel 6.20.32
mysql 8.0.25

questionsテーブルの回答上限数(limit)と
answersテーブルでカウント集計した回答数(answers_count)を
比較し回答上限数(limit)に達していないquestionsレコードを取得したい。
(リレーション先で集計した値とリレーション元が持つカラムの値を使って絞り込みを行いたい)

下記の例では questionsテーブルのid:2のレコードを取得したい。

questionsテーブル

idlimitその他カラムは省略
12
22

answersテーブル

idquestion_idその他カラムは省略
11
21
32

該当のソースコード

laravel

1class Question extends Model 2{ 3 public function answers() 4 { 5 return $this->hasMany('App\Models\Answer'); 6 } 7}

laravel

1model 2 3class Answer extends Model 4{ 5 public function question() 6 { 7 return $this->belongsTo('App\Models\Question'); 8 } 9}

laravel

1controller 2 3$questions = Question::withCount('answers') 4->having('answers_count','<','limit') 5->get(); 6dd($questions); 7 8'limit'を数字 2 など置き換えると期待通り取得できるので、リレーションは通っているようですが、 9リレーション元の'limit'で取得しようとすると下記の通り取得できません。 10上記のコードではquestionのid毎に設定している'limit'を取得出来ないのでしょうか?
上記のコンソールログ Illuminate\Database\Eloquent\Collection {#1553 #items: [] }

laravel

1controller //こちらも試してみました 2 3$questions = DB::table('questions') 4->join('answers', 'questions.id', '=', 'answers.question_id') 5->select('questions.id', 'questions.limit', DB::raw("count(answers.question_id) as answers_count")) 6->groupBy('questions.id') 7->where('answers.answers_count','<','questions.limit') 8->get(); 9dd($questions); 10 11answers_countカラムはないと叱られました。 12
上記のコンソールログ exception: "Illuminate\Database\QueryException" message: "SQLSTATE[42S22]: Column not found: 1054 Unknown column 'answers.answers_count' in 'where clause' (SQL: select `questions`.`id`, `questions`.`limit`, count(answers.question_id) as answers_count from `questions` inner join `answers` on `questions`.`id` = `answers`.`question_id` where `answers`.`answers_count` < questions.limit group by `questions`.`id`)"

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

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

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

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

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

guest

回答1

0

自己解決

DB::rawを使って解決できました。

投稿2021/08/14 08:12

編集2021/08/14 08:17
katase

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問