0

我有一个 CakePHP 模型,我们称之为它Thing,它有一个名为ItemView. ItemView表示项目的一页视图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列。viewsthings

  • 在您的ItemView.php模型中,添加counterCache如下:

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

然后下次通过 进行添加/删除时ItemView,Cake 会自动为您重新计算计数和缓存views,因此下次进行查询时,您还需要确保指定recursive = -1@Paco Car 在他的建议中所建议的内容答案

$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 回答