2012-01-08 15 views
1

は、私は2つのコントローラ私はこのコードを使用このsection..so内の記事へのリンクを持つセクション名を持つすべてのニュースsites..everyブロックのようなブロックの形で記事を取得したい この場合、もっと多くの検索を使用する必要がありますか?

Sections_controller.php 
Articles_controller.php 

Section model hasmany Article... 

を持っています。 ..... まずブロック

$block1=$this->Article->find('all', 
     array(
      'limit' => 4, // just fetch 4 articles 
      'order' => array('Article.created'=>'DESC'), 
      'conditions' => array('Section_id' => 87) 
      ) 
     ); 
      // set the section for the view 
      $this->set(compact('block1')); 

第二ブロック

$block2=$this->Article->find('all', 
     array(
     'limit' => 4, // just fetch 4 articles 
      'order' => array('Article.created'=>'DESC'), 
     'conditions' => array('Section_id' => 88) 
      ) 
     ); 
      // set the section for the view 
      $this->set(compact('block2')); 

およびなど....

誰でもコードを見つける反復することなく、このタスクの最適な方法を持っている。..機能で 予告 ..私カントパス$ IDの場合は、要求サイトのインデックスの例(WWW記事が表示されなければならないので、 .newssite.com)

答えて

1

どれ検索(複数可)のモデルではなく、コントローラで行う必要があります - これはMVC構造と同様に役立ちます「脂肪モデル、スキニーコントローラ」マントラを、以下のMVCの考え方に従ってください。

これがあるだけでなく、それを行うことが「必要がある」、それはまた、あなただけの一箇所にコードを持ってできるようになります方法:

//in the Article model 
function getArticlesBySection($id) { 
    $articles = $this->find('all', array(
     'limit' => 4, 
     'order' => array('Article.created'=>'DESC'), 
     'conditions' => array('Section_id' => $id) 
    )); 
    return $articles; 
} 

//in the Articles controller 
$block1 = $this->Article->getArticlesBySection('87'); 
$block2 = $this->Article->getArticlesBySection('88'); 
$this->set(compact('block1', 'block2')); 

上記は、あなたが望むもののためにうまく動作するはずですが、あなたはそれを改善するために行うことができます多くが常にある操作を行うために - オプションの配列を受け入れることによって、より多くの柔軟性を持つようにそれを設定するように:

//in the Article model 
function getArticles($id, $opts = null) { 
    $params = array(); 

    //limit 
    $params['limit'] = 100; //catchall if no limit is passed 
    if(!empty($opts['limit'])) $params['limit'] = $opts['limit']; 

    //order 
    $params['order'] = array('Article.created'=>'DESC'); 
    if(!empty($opts['order'])) $params['order'] = $opts['order']; 

    //conditions 
    $params['conditions'] = array(); 
    if(!empty($opts['sections'])) array_push($params['conditions'], array('Section_id'=>$opts['sections'])); 

    $articles = $this->find('all', $params); 
    return $articles; 
} 

//in the Articles controller 
$opts = array('limit'=>4, 'sections'=>array('87')); 
$block1 = $this->Article->getArticles($opts); 

$opts['sections'] = array('88'); 
$block2 = $this->Article->getArticles($opts); 

私はそのものがあると確信していますこれをよりリーンにするために行うことができます...など、それはですどのように使いやすく読みやすくするために記述したいのですか?少なくとも、モデルメソッドの考え方と、さまざまな目的のためにそれらを使用し再利用する能力について考えることができます。

+0

おかげさまで、最初のコードブロックが好きです。しかし、「脂肪モデル、スキニーコントローラー」の原則についてもう一度質問します。私はこの原則に従ってスクリプトを速く動かすか、帯域幅を減らすでしょうか...ありがとう – user1080247

+0

スピードや帯域幅よりもコードの構成が重要だと思います。 – Dave

0

これはまっすぐなmysqlクエリーで達成できますが、ケーキにどのようにフィットするかはわかりませんmodel->find機能。あなたはこのような何かすることができます

$articles = $this->Article->query("SELECT * FROM articles a WHERE (SELECT COUNT(*) FROM articles b WHERE a.Section_id = b.Section_id AND a.created < b.created) < 4 ORDER BY a.Section_id, a.created DESC"); 

/* if you look at the results, you should have the 4 latest articles per section. 
Now you can loop through and set up an array to filter them by section. Modify to fit your needs */ 

foreach($articles as $article) { 
    $results[$article['Article']['Section_id']][] = $article; 
} 

$this->set('results',$results); 
関連する問題