San*_*asu 2 cakephp contains find cakephp-2.1
我有以下型号.
我需要找到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)
选项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的缺点是它会让你很难做出像返回多个预告片这样的事情,因为你在电影和预告片之间进行了一次内联(可能).