2017-06-17 45 views
0

不知何故,下面的代码不起作用 - 它打印所有的subforums,而不是只打印一个subforum和它的线程。CakePHP Containable哪里不行

代码:

(控制器类):

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

提供你的表结构以及 –

回答

1

目前还没有这样的contain()签名,它只会在CakePHP 3.5.0中引入,因此第二个参数预计是一个布尔值,并且将被忽略,因此条件不会被应用。

的正确的方法是通过一个阵列中的形式:

['AssociationName' => function() {}] 

但是,即使将被应用的条件,就不能过滤hasMany协会这样一来,因为它们是在一个单独的被检索查询。相反,只需在父级(主要查询)上应用条件,就不需要任何花哨的过滤。

$query = $subforums 
    ->find() 
    ->where(['id' => 1]) 
    ->contain(['threads']); 

或者使用get()通过其主键直接检索单个实体:

$subforum = $subforums->get(1, [ 
    'contain' => ['threads'] 
]); 

ps的,按照约定的别名应该是骆驼capsed,即SubForumsThreads

又见

+0

谢谢,作品! :) – Anoniem