CakePHP 2.1查找使用包含条件

San*_*asu 2 cakephp contains find cakephp-2.1

我有以下型号.

  1. 行业(身份证,姓名)
  2. 电影(id,name,industry_id)[行业有很多电影]
  3. 预告片(id,name,movie_id)[电影有很多预告片]

我需要找到6个最新的预告片Industry.每部电影都不需要预告片或可以有多个[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'
));
Run Code Online (Sandbox Code Playgroud)

Dav*_*ave 7

选项1(最佳选择IMO):

你走在正确的轨道上 - 你现在需要的只是增加使用CakePHP的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'
));
Run Code Online (Sandbox Code Playgroud)

选项2:

另一种选择是使用JOIN(参见CakePHP JOIN).当CakePHP查询由"contains()"调用的每个模型时,它实际上执行单独的查询,然后在返回给您之前加入数据.因此,您不能基于针对子模型的条件来限制父模型,因为它们实际上是单独的查询,并且MySQL将不知道您在条件中尝试引用哪个表.

选项2的缺点是它会让你很难做出像返回多个预告片这样的事情,因为你在电影和预告片之间进行了一次内联(可能).