4

我有以下型号。

  1. 行业(id,名称)
  2. Movie(id, name, industry_id) [行业有很多电影]
  3. Trailer(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'
));
4

1 回答 1

10

选项 1(最佳选项 IMO):

您走在正确的轨道上——您现在只需要添加使用CakePHP 的 CuterCache 即可

基本上,您'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 JOIN)。当 CakePHP 查询由 "contain()" 调用的每个模型时,它实际上会执行单独的查询,然后在返回给您之前连接数据。因此,您不能根据子模型的条件限制父模型,因为它们实际上是单独的查询,并且 MySQL 不会知道您要在条件中引用哪个表。

选项 2 的缺点是它会使返回多个预告片之类的事情变得困难,因为您将在 Movie 和 Trailer 之间进行 INNER JOIN(可能)。

于 2013-01-02T14:19:51.007 回答