CakePHP包含在哪里不起作用

时间:2017-06-17 09:35:55

标签: cakephp where

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

代码:

(控制器类):

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;

由于

1 个答案:

答案 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,按照惯例,你的别名应该是骆驼,即SubForumsThreads

另见