2020.2.18
研修
今回は、Laravel プロジェクトを作成して、システム開発を行っていた時に
解決方法がなかなか判明せず、大変だったものの解決方法についてまとめようと思います。
というのも、Laravelを触るのが初めてで、
DBの操作となると今までSQL文で扱っていました。
そのため、Laravel公式を参照しながら、悪戦苦闘していました(笑)
文字列で検索ができるように OR 検索を導入しようとしたときでした。
とりあえず少し調べて、以下のコードで実行しました。
失敗パターン
$keyword = $request->keyword;
$user = Auth::user();
$items = $user->items()->where("name", "like", "%".$keyword."%")
->orWhere("text", "like", "%".$keyword."%")->get();
これで OR 検索をしようとすると、->where("name", $keyword)
は、ログインしている User の結果だけを返すのですが、->orWhere("text", $keyword)
は、全ての Userの結果を返すのです。
なんでやねん!
とツッコミを入れながらも、改善案を探すことにしました。
where でまとめる |
そうすると、where
をまとめることができるようです!
早速まとめてみます!
失敗パターン
$keyword = $request->keyword;
$user = Auth::user();
$items = $user->items()->where(function ($query) {
$query->where("name", "like", "%".$keyword."%")
->orWhere("text", "like", "%".$keyword."%");
})->get();
これで大丈夫と思ったのですが、エラーが出ます。
スコープの問題で、「$keyword
なんて知らない」といわれます。
これでも悩みました。。。
use で変数を渡す |
どうすればええんや・・・。
と困っているたとき、先輩が解決方法を教えてくださり、
成功パターン
$keyword = $request->keyword;
$user = Auth::user();
$items = $user->items()->where(function ($query) use ($keyword) {
$query->where("name", "like", "%".$keyword."%")
->orWhere("text", "like", "%".$keyword."%");
})->get();
use
を使って解決できたのでした。
asc
でNULL
を後に持ってくるItem を昇順で並べてみます。
失敗パターン
$user = Auth::user();
$items = $user->items()->orderBy("price", "asc")->get();
値段が安いものから表示させたいと、上記のコードで並べてみると、、、、
非売品が先に表示されてしまいます。
そう、非売品の price
はNULL
なんです。
複雑な条件が必要なのか?
はたまた『NULL
』と『NULL
でないもの』で分けて取得する必要があるのか?
と色々考えながら、調べておりました。
->orderByRaw('column is null asc') |
->orderByRaw('column is null asc')
を使うと、NULL
を後ろに回すことができます。
※column
の部分に DB のカラム名が入ります。
成功パターン
$user = Auth::user();
$items = $user->items()->orderByRaw('price is null asc')
->orderBy("price", "asc")->get();
これで、値段の安い順に並びつつ、NULL
である非売品は、後ろに並びます。
やはり初めて触ると分からないことだらけで、
何が原因なのかを究明することにも
どうすれば解決できるかを調べることにも
時間がかかってしまいます。
しかし、その時間がとても大切な自分の成長する時間だと今は思っています。
どんどん新しく成長していく業界に身を置いている以上、
新たな知識を得ることに抵抗を感じない姿勢で頑張っていきたいと思います。
最後まで読んでいただき、ありがとうございました。