CakePHP 2.1查找使用包含条件

时间:2013-01-02 13:31:23

标签: cakephp find cakephp-2.1 contains

我有以下型号。

  1. 行业(身份证,姓名)
  2. 电影(id,name,industry_id)[行业有很多电影]
  3. 预告片(id,name,movie_id)[电影有很多预告片]
  4. 我需要为每个Industry找到6个最新的预告片。每部电影都不需要预告片或可以有多个[0-n]。

    结果必须包含至少一个预告片的电影数组。

    $this->Industry->find('all', array(
        'contain' => array(
            'Movie' => array(
                'Trailer' => array(
                    'limit' => 1
                ),
                'order' => 'Movie.release DESC',
                'limit' => 6
            )
        ),
        'order' => 'Industry.name ASC'
    ));
    

1 个答案:

答案 0 :(得分:7)

选项1(最佳选项IMO):

你走在正确的轨道上 - 你现在需要的只是增加使用CakePHP's CouterCache

基本上,您在'counterCache' => true关联中设置$belongsTo,并添加一个字段:singularModel_count(在您的情况下,trailer_count字段movies表)。然后,您可以对该字段进行调整(请参阅下面的更改代码)。

CakePHP的CounterCache通过CakePHP方法添加/删除任何东西时,会自动跟踪它有多少项目。

$this->Industry->find('all', array(
    'contain' => array(
        'Movie' => array(
            'conditions' => array(
                'Movie.trailer_count >' => 0  // <-- Notice this addition
            ),
            'order' => 'Movie.release DESC',
            'limit' => 6,
            'Trailer' => array(
                'limit' => 1
            ),
        )
    ),
    'order' => 'Industry.name ASC'
));

选项2:

另一种选择是使用JOIN(参见CakePHP JOINs)。当CakePHP查询由&#34; contains()&#34;调用的每个模型时,它实际上执行单独的查询,然后在返回给您之前加入数据。因此,您无法根据子模型的条件限制父模型,因为它们实际上是单独的查询,并且MySQL不知道您在条件中尝试引用的表格

选项2的缺点是,由于你在电影和预告片之间(可能)正在进行内部加入,因此很难做出返回多个预告片之类的事情。