v1.8にて、ORMでSELECTしたものをORDER_BYに指定するとエラー

167 views
Skip to first unread message

friends

unread,
Aug 15, 2017, 2:13:15 PM8/15/17
to fuelphp.jp
ORMで以下のFindメソッドを実行しようとしました。
(一部省略しております。)
$ranks = Model_Access::find("all", [
         
"select" => [
             
"article_id",
             
[DB::expr("COUNT(*)"), "views"],
         
],
         
"group_by" => [
             
"article_id"
         
],
         
"order_by" => [
             
"views" => "DESC"
         
]
     
]);



しかし、以下のエラーが発生してしまいました。

Fuel\Core\Database_Exception [ 1054 ]:
SQLSTATE[42S22]: Column not found: 1054 Unknown column 't0.views' in 'order clause'

SELECTでCOUNTしたものに `views` というカラム名をつけ、
これをORDER_BYで降順に指定する過程で問題が発生しているみたいです。
ORDER_BYは、実際にテーブルにカラムが存在しないと利用できないのでしょうか?

何とかCOUNTしたものにORDER_BYを指定したいのですが、何らかの方法は御座いませんでしょうか。

稚拙な文章ですいません。
皆様のお知恵を拝借させていただきたく存じます。 

kit.t

unread,
Aug 15, 2017, 10:45:52 PM8/15/17
to fuelphp.jp
kittです。

Model::findからSELECTに別名を指定してもAS句として使用されないようです。
DB::last_query()等で実行されるSQL文を確認すると分かりますが、SQL中では「COUNT(*) AS `t0_c1`」となっています。
そのため、以下のように指定すれば並び替える事が可能です。(数字がSELECTに与える内容により変動するため、注意が必要なように思います。)

$ranks = Model_Access::find("all", [
         
"select" => [
             
"article_id",
             
[DB::expr("COUNT(*)"), "views"],
         
],
         
"group_by" => [
             
"article_id"
         
],
         
"order_by" => [

             
[DB::expr("t0_c1"), "DESC"]
         
]
     
]);


並び替える事だけが目的であれば、以下のようにORDER_BYに直接COUNTを指定する方がシンプルだと思われます。

$ranks = Model_Access::find("all", [
         
"select" => [
             
"article_id",

         
],
         
"group_by" => [
             
"article_id"
         
],
         
"order_by" => [

             
[DB::expr("COUNT(*)"), "DESC"]
         
]
     
]);

Reply all
Reply to author
Forward
0 new messages