2011-08-08 6 views
0

私は右のメニューに自分のサイトの10の最も人気のあるタグ(科目)を要素として挙げることができます。Cakephpで2つ以下のクエリでストーリーの数を含むすべてのタグ(HABTM)をリストする方法は?

私は今これについて30分を考えていましたが、これを行うために1つのステートメントで終わるのとは違って、私はサイトのパフォーマンスを大幅に低下させる3つのステートメントで終わっているようです。

私は短編小説とタグを持つサイトを持っています。これは、テーブル 'stories_tags'を使用するHABTM(Has-and-belong-to-many)関係です。ストーリーは複数のタグを持つことができ、タグは複数のストーリーで使用できます。

目標は、タグあたりのストーリー数の最大値から、$ tagname($ storycountwiththattag)を10番目に高い値にリストすることです。私はこれまでこれを持っていますが、あまりにも近くには見えません。

$tags = $this->Tag->find('all',array('fields'=>array('Tag.name'))); 
$tags_count = $this->Tag->Story->find('count',array('conditions'=>array('Story.tag'=>$tags))); 
debug($tags_count); 

私は多くの可能なクエリを試しました。タグごとに1カウントクエリを実行しているすべてのタグ

  • のすべてのIDを取得

    1. ...
    2. それらの結果を使用してください:私は、制限のfind(「すべて」)さん、またはではでそれを行うことができます。

    しかし私はより良いアプリケーションを作るためにCakephpを選んだので、どうやってこれをやるのだろうと思った!このサイトでは毎日数百人の訪問者しかいないので、パフォーマンスはきわめて重要ではありませんが、極端に愚かなクエリを避けることは、パフォーマンス上の不利益が問題にならない場合でも対処すべきことです。

  • 答えて

    1
    あなたのタグに

    使用counterCache(あなたががHABTMを使用することはできませんが、あなたは別の「タグhasManyのStoriesTag」の関係を定義する必要があります。また、Cacheクエリ結果。

    0

    は、私はいくつかのテストを行うことができます 同じシナリオが、貴様ModelNamesに。私はあなたがそれを使用することができると思います。

    function top(){ 
    
        $options = array(
          'fields' => array('*','COUNT(CategoriesEnterprise.enterprise_id) AS num') 
         , 'group' => array('CategoriesEnterprise.category_id') 
         , 'order' => 'num DESC' 
         , 'limit' => '3' 
         , 'joins' => array(array(
          'table' => 'categories', 
          'alias' => 'Category', 
          'type' => 'LEFT', 
          'conditions' => array('CategoriesEnterprise.category_id = Category.id') 
         )) 
        ); 
    
        $categories = $this->Category->CategoriesEnterprise->find('all', $options); 
    
        debug($categories); 
        $this->autoRender = false; 
    } 
    

    結果

    Array 
        (
         [0] => Array 
         (
          [CategoriesEnterprise] => Array 
           (
            [category_id] => 3 
            [enterprise_id] => 7 
           ) 
    
          [Category] => Array 
           (
            [id] => 3 
            [name] => Turismo y Viajes 
            [modified] => 2011-05-16 
            [created] => 2011-04-14 
           ) 
    
          [0] => Array 
           (
            [num] => 4 
           ) 
    
         ) 
    
        [1] => Array 
         (
          [CategoriesEnterprise] => Array 
           (
            [category_id] => 24 
            [enterprise_id] => 5 
           ) 
    
          [Category] => Array 
           (
            [id] => 24 
            [name] => Compras 
            [modified] => 2011-05-05 
            [created] => 2011-05-05 
           ) 
    
          [0] => Array 
           (
            [num] => 3 
           ) 
    
         ) 
    
        [2] => Array 
         (
          [CategoriesEnterprise] => Array 
           (
            [category_id] => 32 
            [enterprise_id] => 8 
           ) 
    
          [Category] => Array 
           (
            [id] => 32 
            [name] => Salud y Belleza 
            [modified] => 2011-05-16 
            [created] => 2011-05-16 
           ) 
    
          [0] => Array 
           (
            [num] => 3 
           ) 
    
         ) 
    
    ) 
    
    関連する問題