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

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

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

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

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

1回答

16396閲覧

Laravel5.4で複数カラムでOrderBy

Lab-art_Yamada

総合スコア14

PHP

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

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

2クリップ

投稿2018/03/09 14:59

MAMPP & PHP5.6 & Laravel5.4で開発中です。

OrderByを複数指定する方法がわかりません。。。
検索すると、

orderBy('hoge','asc)->orderBy('fuga','desc')->get(); ```みたいな感じで問題ないっぽいんですが、実際に、

$order= DB::table('mtb_lang')->orderBy('id','asc')->orderBy('name','asc')->get();

データは問題なく取得できているのですが。。。 どのように記述すれば良いのでしょうか。

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

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

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

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

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

guest

回答1

0

ベストアンサー

先に指定したorderしか反映されません。

と思い込んでいる説。実際に発行されたクエリは確認しましたか?

php

1DB::enableQueryLog(); 2DB::table('mtb_lang')->orderBy('id', 'asc')->orderBy('name', 'asc')->get(); 3dd(collet(DB::getQueryLog())->last());

プレースホルダとSQL本文が分離されていてもよければこちらでもOK
(こちらは実際に実行はされません)

php

1dd(DB::table('mtb_lang')->orderBy('id', 'asc')->orderBy('name', 'asc')->toSql());

まあ,先に答えを言っておきますが, id を指定したら name が無視されるのは当たり前です。 id だけで順序が決まりますからね。

もし name でソート → id でソート,が良ければ指定する順番が逆です。

投稿2018/03/09 17:12

編集2018/03/09 17:15
mpyw

総合スコア5223

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

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

mpyw

2018/03/09 17:24 編集

本題とは関係ないですが,もし「速くてずれない」ページネーションをお求めでしたらこちらをご利用ください↓ lampager/lampager-laravel: Rapid pagination for Laravel https://github.com/lampager/lampager-laravel こんな感じで使えます↓ DB::table('mtb_lang')->lampager()->orderBy('id', 'asc')->orderBy('name', 'asc')->limit(10)->paginate();
Lab-art_Yamada

2018/03/09 22:27

SQL文確認できるんですね。 SQL見たら正しく実行されていました&色々勘違いしてました! 本当は、「birth」っていうDate型のカラムがあって、そこに生年月日を保存しています。 データ取得後にPHPで年齢計算して表示していたので、年齢(実は生年月日)→IDでorderByした時に 「ID順になってない…」って勘違いしたのが事の発端でした。。。 (その後、疑心暗鬼になって「ちゃんと動いてない…」モードに突入していました。。。) Eloquentを使用しているのですが、SELECT句に TIMESTAMPDIFF(YEAR, birth, CURDATE()) AS age を追加して、ageでソートする事って可能なのでしょうか? ※ページネーション、一度試させて頂きます。ありがとうございます!
mpyw

2018/03/10 04:08 編集

ORDER BY には age ではなく TIMESTAMPDIFF(YEAR, birth, CURDATE()) として元の形で書かなければなりません。また,このように計算式でソートするのはソート時にインデックスが全く利用されないため非常に遅いです。インデックスをbirthカラムに対して張った上で, ORDER BY birth してください。これで同じ結果が得られるはずです。 MySQLでインデックスを貼る時に読みたいページまとめ(初心者向け) https://qiita.com/C058/items/1c9c57f634ebf54d99bb (ちなみに上で紹介した Lampager もインデックスが張られていないとうまみが半減します)
Lab-art_Yamada

2018/03/11 02:19

試してみたら問題なく動作しましたー! インデックスも参考URLを拝見して設定します。 ありがとうございました!!
mpyw

2018/03/11 05:07 編集

1点ちょっと補足。上の記事では「covering index が理想」と書いてあって,確かにそうなんですが、MySQL5.6以降では「index condition pushdown」という機能が追加されており,covering index でなくともある程度高速に動作するようになっているので,以前より追加のWHERE条件に対して神経質になる必要はなくなっています。 https://qiita.com/hrokmim/items/7843fcd362e348e9a857
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問