[自己解決しました]はびたむでBelongsToManyでの絞り込み[嘘ですわかりません]

[教えてCakePHP]はびたむでBelongsToManyでの絞り込み – /halt/Snapshot

ダメなのはSQLiteだからでしょうか。

ようは、ブログのエントリとそれに付随するタグをアソシエーションでとりたいんですが、普通にとるのはすぐできたけど、「指定したタグを持つエントリ最新5件」が「最初にエントリをとってそれにタグをつける」というはびたむの構造上どうやってもできねー。という話でした。

こんな時はwithを使います。

CakePHP HABTMをもっと強力にする with Model | エクサイト

Categoryモデルは前回と同じ。今度は連結に使うCategoryListもモデルにする。Articleにwithを指定する。以下のような感じ。


class Article extends AppModel
{
   var $name = 'Article';
   var $useTable = 'article';
   var $hasAndBelongsToMany = array(
       'Category' => array(
           'className' => 'Category',
           'joinTable' => 'category_list',
           'with' => 'Category',
           'dependent' => true,
           'foreignKey' => 'article_id',
           'associationForeignKey' => 'category_id',
           'unique' => false,
           //'limit' => 5,
       )   
   );  
}

class CategoryList extends AppModel
{
   var $name = 'CategoryList';
   var $useTable = 'category_list';
   var $blongsTo = array('Article', 'Category');
}

で、あとはcontrollerから


$articles = $this->Article->Category->find('all', array(
        'conditions' => array('Category.code' => 'mobile'),
        'limit' => 5,
    )
);

とかしてあげると一発目のクエリをCategoryから発行。それに付随するfwaregthhhhhweriahr!!!!!!!!!!!!!!

ダメだ!これ全然関係なかったですすいません!!!!

これだとカテゴリ毎に配列が構成されてしまう…複数のカテゴリを持つエントリとかどうするんだ…

というかですね。上のサイトのconditionを見るとわかるんですが、


'conditions' => array('UsersEvent.presence' => 1, 'Event.name' => 'hoge')

こんな風にアソシエーション先のconditionが定義できればいいんですがね…

こんなのうちの環境じゃどうやっても通りません。findのconditionに指定できるのはfindを呼んでるモデル上のカラムしか指定できないんで。前エントリのSQLのdebugクエリを見るとわかるけど。

という事はmysqlだと普通にいけちゃう?またSQLiteいじめかこれは。

投稿者: halt

PHPプログラマ。

“[自己解決しました]はびたむでBelongsToManyでの絞り込み[嘘ですわかりません]” への 2 件のフィードバック

  1. なにをやってもドツボにはまりそうなのであきらめて寝る事にする。
    直接クエリ打ってよしなにやる方法を教えてください。

  2. 誰も回答していないようなので、通りすがりの私が答えてみますよ、と。

    SELECT *
    FROM
    article AS Article
    INNER JOIN category_list AS CategoryList
    ON Article.id = CategoryList.article_id
    INNER JOIN category AS Category
    ON Category.id = CategoryList.category_id
    WHERE
    Category.name IN (‘mobile’,’murmur’)
    GROUP BY
    Article.id
    ORDER BY
    Article.timestamp DESC;

    SQLite3で試しましたが、CakePHP+SQLite2では保障できません。

    joinSettingsを使って上記と同様のJOINを組む方法もあります。
    http://d.hatena.ne.jp/nori0620/20080510/1210418348

    SQLiteでの運用は未経験なので駄目だったらすいません。。。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

ねこ認証:9つのパネルの中からねこを3匹選んでください