🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Laravel

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Eloquent

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

Q&A

解決済

1回答

5363閲覧

SELECT句に指定したカラムをEloquentのwhereやhaving条件で指定する方法

spell

総合スコア16

Laravel

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Eloquent

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

0グッド

0クリップ

投稿2019/11/27 03:39

編集2019/12/01 15:25

Laravel 5.8 で Eloquentを使用してSQLを作成しています。

元々は

mySQL

1SELECT 2 hoge1_column 3 , hoge2_column 4 , hoge3_column 5 , LEAST( COALESCE( MIN( hoge1_flg ), 99 ), COALESCE( MIN( hoge2_flg ), 99 ), COALESCE( MIN( hoge3_flg ), 99 ) ) AS hoge_status 6FROM 7 hoge 8LEFT JOIN 9 hoge1 ON hoge.fuga = hoge1.fuga 10LEFT JOIN 11 hoge2 ON hoge.fuga = hoge2.fuga 12LEFT JOIN 13 hoge3 ON hoge.fuga = hoge3.fuga 14WHERE 15 hoge_flg = 1 16GROUP BY 17 hoge1_column 18HAVING 19 hoge3_column = 1 OR ( hoge2_column = 0 AND hoge_status = 1 );

だったのですが、having以降の条件をscopeに出すために下記のようにEloquentで作成しました。

Eloquent

1self::selectRaw( 'hoge1_column, hoge2_column, hoge3_column' ) 2 ->selectRaw( 'LEAST( COALESCE( MIN( hoge1_flg ), 99 ), COALESCE( MIN( hoge2_flg ), 99 ), COALESCE( MIN( hoge3_flg ), 99 ) ) AS hoge_status' ) 3 ->leftJoin( 'hoge1', 'hoge.fuga', '=', 'hoge1.fuga' ) 4 ->leftJoin( 'hoge2', 'hoge.fuga', '=', 'hoge2.fuga' ) 5 ->leftJoin( 'hoge3', 'hoge.fuga', '=', 'hoge2.fuga' ) 6 ->groupBy( 'hoge1_column' ) 7 ->get();

ここで条件を付加するために

Eloquent

1having( 'hoge3_column', '=', '1' )

を追加したところ Unknown column が出たため

Eloquent

1where( 'hoge3_column', '=', '1' )

とwhereを使うようにstackovweflowで見かけたため、変更しました。
そちらは上手くいったのですが、
hoge_statusを使うために

Eloquent

1havingRaw( 'hoge2_column = 0 AND hoge_status = 1' )

としたところUnknown column が出ます。
whereRawに変えても同様のエラーがでます。

上記の条件を付加せずに取得したCollectionのModelのattributeには hoge2 も hoge_statusも存在します。

どのようにwhere条件またはhaving条件を書けばよいでしょうか?

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

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

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

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

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

tomoeine

2019/11/29 06:48

元のSQLは本当に動作しますか? - FROM よりも前に JOIN がある - hoge1, hoge2, hoge3 は JOIN していることからテーブル名と思われるが、 SELECT・GROUP BY・HAVING でカラム名として扱われている などから動かないように見えますが・・・
spell

2019/12/01 15:18

FROMの位置のコピペミス及びカラム名を変更しました。
guest

回答1

0

自己解決

mySQL

1SELECT 2 hoge1_column 3 , hoge2_column 4 , hoge3_column 5 , LEAST( COALESCE( MIN( hoge1_flg ), 99 ), COALESCE( MIN( hoge2_flg ), 99 ), COALESCE( MIN( hoge3_flg ), 99 ) ) AS hoge_status 6FROM 7 hoge 8LEFT JOIN 9 hoge1 ON hoge.fuga = hoge1.fuga 10LEFT JOIN 11 hoge2 ON hoge.fuga = hoge2.fuga 12LEFT JOIN 13 hoge3 ON hoge.fuga = hoge3.fuga 14WHERE 15 hoge_flg = 1 16GROUP BY 17 hoge1_column

をEloquentのfromに設定し、

mySQL

1hoge3_column = 1 OR hoge2_column = 0 AND hoge_status = 1

をwhere句に入れる事で意図した結果を得る事が出来ました。
ただ、スマートな方法ではないので何とも言えませんが、とりあえずは目的を達成できました。

投稿2019/12/01 15:22

spell

総合スコア16

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問