0

Thingという名前の関連モデルを持つCakePHP モデルを呼び出しましょうItemViewItemViewアイテムの 1 ページ ビューを表しThingます。閲覧回数を表示したいThingので、ビューで次のようにします。

<?php echo count($thing['ItemView']); ?>

これはうまくいきますが、現在次のように返されているため、時間が経つにつれて、このクエリの結果セットは巨大になります。

array(
    'Thing' => array(
        'id' => '1',
        'thing' => 'something'
    ),
    'ItemView' => array(
        (int) 0 => array(
            'id' => '1',
            'thing_id' => 1,
            'created' => '2013-09-21 19:25:39',
            'ip_address' => '127.0.0.1'
        ),
        (int) 1 => array(
            'id' => '1',
            'thing_id' => 1,
            'created' => '2013-09-21 19:25:41',
            'ip_address' => '127.0.0.1'
        ),
        // etc...
    )
)

find()次のようなものを取得するようにモデルを適応させるにはどうすればよいですか:

array(
    'Thing' => array(
        'id' => '1',
        'thing' => 'something',
        'views' => 2
    )
)

リレーション全体ItemViewをメモリにロードせずに?

ありがとう!

4

1 に答える 1

0

非常に簡単です。次の機能を利用できcountercacheます。レコードが に追加/削除されるたびに、Cake がカウントを行いますItemView

  • Thing.phpモデルで変更するものは何もありません

  • INTテーブルに新しい列を追加viewsしますthings

  • モデルに、次のようItemView.phpに追加します。counterCache

    public $belongsTo = array(
        'Thing' => array(
            'counterCache' => 'views'
        )
    );
    

次に を介して追加/削除を行うItemViewと、Cake は自動的にカウントを再計算し、キャッシュします。そのため、次回クエリを実行するときは、 @Paco Car が提案したものviewsを指定する必要があります。答え:recursive = -1

$this->Thing->recursive = -1;
$this->Thing->find(...); //this will returns array of Thing + the field "views"

// --- OR ---

$this->Thing->find(array(
    'conditions' => array(
        //... your usual conditions here
    ),

    //... fields, order... etc

    //this will make sure the recursive applies to this call, once only.
    'recursive' => -1
);
于 2013-09-22T02:16:35.313 に答える