我有以下型号。
我需要为每个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'
));
答案 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的缺点是,由于你在电影和预告片之间(可能)正在进行内部加入,因此很难做出返回多个预告片之类的事情。