Blog

Eloquent で困ったことの解決方法

Eloquent で困ったことの解決方法

今回は、Laravel プロジェクトを作成して、システム開発を行っていた時に
解決方法がなかなか判明せず、大変だったものの解決方法についてまとめようと思います。

というのも、Laravelを触るのが初めてで、
DBの操作となると今までSQL文で扱っていました。

そのため、Laravel公式を参照しながら、悪戦苦闘していました(笑)

OR 検索

文字列で検索ができるように 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を使って解決できたのでした。


ascNULLを後に持ってくる

Item を昇順で並べてみます。

失敗パターン

$user = Auth::user();
$items = $user->items()->orderBy("price", "asc")->get();

値段が安いものから表示させたいと、上記のコードで並べてみると、、、、

非売品が先に表示されてしまいます。
そう、非売品の priceNULL なんです。

複雑な条件が必要なのか?
はたまた『NULLと『NULLでないもの』で分けて取得する必要があるのか?

と色々考えながら、調べておりました。

->orderByRaw('column is null asc')

POINT

->orderByRaw('column is null asc')を使うと、NULLを後ろに回すことができます。

columnの部分に DB のカラム名が入ります。

成功パターン

$user = Auth::user();
$items = $user->items()->orderByRaw('price is null asc')
            ->orderBy("price", "asc")->get();

これで、値段の安い順に並びつつ、
NULLである非売品は、後ろに並びます。


やはり初めて触ると分からないことだらけで、
何が原因なのかを究明することにも
どうすれば解決できるかを調べることにも
時間がかかってしまいます。

しかし、その時間がとても大切な自分の成長する時間だと今は思っています。

どんどん新しく成長していく業界に身を置いている以上、
新たな知識を得ることに抵抗を感じない姿勢で頑張っていきたいと思います。

最後まで読んでいただき、ありがとうございました。

MeisterGuild(マイスター・ギルド)広報

最先端技術のMEISTERを目指し、お互い切磋琢磨するGUILD、になりたい株式会社マイスター・ギルドです。Webシステム/サービス開発、スマホアプリ開発、AR/VR/MR開発など、さまざまな情報を発信します。

Related Entry