CakePHP

クエリエラーが出る

 ブックマークを管理するページを作ろうとして、そのブックマークにはコメントをぶら下げられるようにしたい。

 各テーブルの構成は次の通り。データベースはPostgreSQL。

create table bookmarks (
      id    serial,
      label varchar(256)       not null,
      tag   text,
      title varchar(512),
      url   varchar(512)       not null,
      created timestamp        not null default now(),
      modified timestamp       not null default now(),
      primary key (id)
);
create table comments (
      id               serial,
      bookmarkid       int                 not null,
      body             text                not null,
      created          timestamp           not null default now(),
      modified         timestamp           not null default now(),
      primary key (id)
);

 また、アソシエーションは、Bookmarkモデルに次のように定義した。

   var $hasMany = array ( "Comment" =>
                          array (
                                 "className"   => "Comment",
                                 "conditions"  => "",
                                 "order"       => "",
                                 "limit"       => "",
                                 "foreignKey"  => "bookmarkid",
                                 "dependent"   => true,
                                 "exclusive"   => false,
                                 "finderQuery" => ""
                                 )
                          );

 これで、表示はできるようになった。

 ただ、ブックマークはID順に表示されてしまう。

 新しいブックマークほど先頭に表示されるようにしたいので、$hasManyのところで、

"order"       => "bookmarks.id desc"

としてみたところ、下記のクエリエラーが発生する。

Warning (512): SQL Error: ERROR:  missing FROM-clause entry for table "bookmarks"
LINE 1: ...IN ('1', '2', '3', '4', '5', '6', '7')   ORDER BY "bookmarks...
                                                            ^ [CORE/cake/libs/mo
                                                            del/datasources/dbo_source.php, line 512]
Query: SELECT "Comment"."id" AS "Comment__id", "Comment"."bookmarkid" AS 
"Comment__bookmarkid", "Comment"."body" AS "Comment__body", "Comment"."created"
 AS "Comment__created", "Comment"."modified" AS "Comment__modified" FROM 
 "comments" AS "Comment" WHERE "Comment"."bookmarkid" IN ('1', '2', '3', '4', 
 '5', '6', '7') ORDER BY "bookmarks"."id" desc

 ごちゃごちゃしてわかりにくいが、エラーの原因は、FROMの後にCommentsテーブルだけしか指定されていないのが原因。

 わかりやすくすると、

select id, bookmarkid, body, created, modified
  from comments
 where bookmarkid in (1, 2, 3, 4, 5, 6, 7)
 order by bookmarks.id desc

これはどうやってもエラーになるわな。

 試しに、DBにコマンドラインからつないで、上記SQLを修正(from comments, bookmarksにする)したら、期待する結果を返してくる。

 よくわからない…

 
 

ふと

 思って、

"order"=>"bookmarkid desc"

としたら、エラーはなくなった。

 これでいいのかな。

 親テーブル(ここではブックマークのテーブル)のフィールドは指定できないのかな?

さらに

 ブックマークのコントローラ側の$paginateプロパティで、orderを指定したら、ちゃんとブックマークは新しい順、コメントはふるいのからと言う、期待通りの出力が得られた。

   var $paginate = array (
                          'limit' => '10',
                          'order' => array ( 'Bookmark.id' => 'desc' )
                          );

 また、ここにたどり着く前に、「paginate」を「pagenate」とスペルミスしていたために、余計発見が遅れてしまった。


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS