CakePHP Containable 哪里不起作用

CakePHP Containable where doesn't work

不知何故,以下代码不起作用 - 它打印所有子论坛,而不是只打印一个子论坛及其主题。

代码:

(控制器 Class):

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);
    }

(Table)

 public function initialize(array $config)
    {
      $this->hasMany('threads');
    }

Table结构:

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;

谢谢

还没有这样的 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.

另见