RSS

検索条件を構成し、かつpaginateを行う場合の処理

07 1月

そろそろフォーラムに質問すべきか悩む・・・。
前提条件

  • A HasOne a の状態のモデルを用意(belongToも設定)
  • A HasMany b の状態のモデルを用意(belongToも設定)
  • Aモデルはa、bの両方のモデルデータを持つことはない(どちらか片方)
  • この状態で

  • a を検索する画面を作成(当然Aモデルのデータももってくるし、検索も行う)
  • b を検索する画面を作成(当然Aモデルのデータも持ってくるし、検索も行う)
  • こういう状態の場合にaモデルを検索する画面で、以下のようなソースをかいた。
    ちなみに、コントローラー部です。(AのController部)

    $search = $this->A->getSearchItem($this->data);//モデルに実装した自前メソッド。検索条件をただ返しているだけ。
    		//Aテーブルとaを強制的にINNER JOINする。
    		$this->paginate['A'] = array(
    		'limit' => 10
    		, 'contain' => ''
    		, 'conditions' => $search['cond']
    		, 'fields' => array('A.*', 'a.*')
    		, 'joins' => array(
    			array(
    			'table' => 'a'
    			, 'type' => 'INNER'
    			, 'alias' => 'a'
    			, 'conditions' => $search['a']
    		)
    		)
    		);
     
        $this->set("user_list",$this->paginate('A'));
        $this->set("post",$post);
    

    ハイライト箇所で、入力されたA,aの検索条件を組み立てている。ここはModelで実装させた。ここで、検索条件の設定はモデルでできたのだけど、強制的にINNER JOINさせる記述と、あわせてpaginateの条件をセットする箇所はどうしてもモデル部分に記載できない。つまり$this->paginate[‘A’] …の部分。これってしょうがないことなのかな?たとえば、検索結果画面一覧から、別ページに飛んで、なんらかの処理をした後に同じ検索結果一覧に戻りたい場合は、このコントローラーのメソッドを呼び出すということになるんだろうか…。
    今、一緒に開発をしている人も、「ビジネスロジックをできるだけモデルに書いたほうがいいのはわかるが、paginateを使おうとするとモデルの組み立てと合わせてすべてがコントローラー部に偏ってしまう」という話がでててあ、同じこと思っているんだな、と思ったわけなんです。それとも、開発を行っている皆さんは独自のpaginationを作成しているのだろうか。cakePHPのpaginateを使ってないのでしょうか・・。それとも、INNER JOIN させる方法がもっと楽なものであるのかな。うーむ。INNNER JOINの仕方がおかしいとか、もしそういうご指摘がありましたらお知らせください・・。強制的にINNNER JOINしている箇所は A と aのモデルだけを強制的にINNER JOINさせたいのでこのような書き方をしています。他のアソシエーションしているモデルの取得が必要ないので。

    難しいなり(-公-;)Model。

    広告
     
    コメントする

    投稿者: : 1月 7, 2010 投稿先 cakephp

     

    コメントを残す

    以下に詳細を記入するか、アイコンをクリックしてログインしてください。

    WordPress.com ロゴ

    WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

    Twitter 画像

    Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

    Facebook の写真

    Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

    Google+ フォト

    Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

    %s と連携中

     
    %d人のブロガーが「いいね」をつけました。