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

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

詳細はこちら
Laravel

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

Q&A

解決済

2回答

936閲覧

orwhereがうまく使えない

kentooooo

総合スコア18

Laravel

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

1グッド

0クリップ

投稿2019/12/15 10:30

編集2019/12/15 10:31

+----+-------+------+------+----
| id | val1 | val2 |val3 |val4
+----+-------+------+------+----
| 1 | aaaaa | null |null |こんにちわ
+----+-------+------+------+----
| 2 | null | bbbb |null |こんばんわ
+---+-------+------++----+-------
| 3 | aaaaa | bbbb |ccccc |さようなら
+----+-------+------++----+------
|4 | null | null |null |またあした
+----+-------+------++----+-------

みたいなDBがあります。

この中で、val1=aaaaaまたは、val2=bbbbのものの、val4カラムの値を表示させたいのですが

クエリビルダでうまくかけず困っています

php

1$Messages = Message::orWhere([ 2 ['val1',"aaaaa" ], 3 ['val2',"bbbb"], 4 ])->pluck("val4");

だとなぜか全件取得されます
結果としては、
こんにちわ
こんばんは
さようなら

を表示させたいです。初歩的な質問かもしれませんがよろしくお願いします

mpyw👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

ご提示のコードでうまく動かない原因はコメントしたとおり,

select * from `messages` where (`val1` = 'aaaaa' and `val2` = 'bbbb')

という SQL になるからです。全件取得されるのはちょっと謎ですが,少なくとも orWhere の OR は条件のまとまり の前につけられるために存在しているため,条件のまとまりの中身に付与したい場合は方法を誤っていることになります。

もし

select * from `messages` where (`val1` = 'aaaaa' or `val2` = 'bbbb')

にしたい場合は

Message::where([ ['val1', '=', 'aaaaa'], ['val2', '=', 'bbbb', 'or'], ])->pluck('val4');
Message::where([ ['val1', '=', 'aaaaa', 'or'], ['val2', '=', 'bbbb', 'or'], ])->pluck('val4');
Message::where('val1', 'aaaaa') ->orWhere('val2', 'bbbb') ->pluck('val4');
Message::orWhere('val1', 'aaaaa') ->orWhere('val2', 'bbbb') ->pluck('val4');

のいずれかが正解です。
(条件のまとまりの先頭の or は意味を持たないので and or のどちらでも構いません)

投稿2019/12/17 18:08

mpyw

総合スコア5223

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

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

0

php

1$messages = Message::where('val1',"aaaaa") 2 ->orWhere('val2',"bbbb") 3 ->pluck("val4");

投稿2019/12/16 13:53

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

kentooooo

2019/12/16 14:35

Val1についてはwhereでいいのですか?
退会済みユーザー

退会済みユーザー

2019/12/16 15:41 編集

試して見て問題があるなら指摘してください ところで、生のSQLで問合せする場合のSQLがどうなると正解だと思っているのですか?
mpyw

2019/12/17 17:40

これ Laravel 本体のバグ踏んでるかもしれません,ちょっと調べてみます
mpyw

2019/12/17 17:55

バグかと思いましたが, ... OR (val1 = 'aaa' AND val2 = 'bbb') の,前にある「OR」のための orWhere なので正常な動きでした。失礼しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問