以下代码不起作用 - 它打印所有子论坛,而不是只打印一个子论坛及其主题。
代码:
(控制器类):
public function view($id)
{
$subforums = TableRegistry::get('subforums');
$query = $subforums->find('all');
$query
->contain('threads', function ($q) {
return $q->where(['threads.sub_forum_id' => 1]);
});
$this->set('query', $query);
}
(表)
public function initialize(array $config)
{
$this->hasMany('threads');
}
表格结构:
CREATE TABLE `sub_forums` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`desc` text,
`forum_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE `threads` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`body` text,
`sub_forum_id` int(11) DEFAULT NULL,
`last_post_date` varchar(255) DEFAULT NULL,
`starter` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
由于
答案 0 :(得分:2)
还没有这样的contain()
签名,它只会在CakePHP 3.5.0中引入,因此第二个参数应该是一个布尔值,并且将被忽略,因此不会应用条件。 / p>
正确的方法是以以下形式传递数组:
['AssociationName' => function () {}]
但即使应用条件,也无法以这种方式过滤hasMany
关联,因为它们是在单独的查询中检索的。相反,只需在父(主查询)上应用条件,就不需要任何花哨的过滤。
$query = $subforums
->find()
->where(['id' => 1])
->contain(['threads']);
或使用get()
通过其主键直接检索单个实体:
$subforum = $subforums->get(1, [
'contain' => ['threads']
]);
ps,按照惯例,你的别名应该是骆驼,即SubForums
和Threads
。
另见