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,即 SubForums
和 Threads
.
另见
- API > \Cake\ORM\Query::contain()
- Cookbook > Database Access & ORM > Query Builder > Loading Associations
- Cookbook > Database Access & ORM > Retrieving Data & Results Sets > Getting a Single Entity by Primary Key
- Cookbook > Filtering by Associated Data Via Matching And Joins
- Cookbook > CakePHP at a Glance > CakePHP Conventions
不知何故,以下代码不起作用 - 它打印所有子论坛,而不是只打印一个子论坛及其主题。
代码:
(控制器 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,即 SubForums
和 Threads
.
另见
- API > \Cake\ORM\Query::contain()
- Cookbook > Database Access & ORM > Query Builder > Loading Associations
- Cookbook > Database Access & ORM > Retrieving Data & Results Sets > Getting a Single Entity by Primary Key
- Cookbook > Filtering by Associated Data Via Matching And Joins
- Cookbook > CakePHP at a Glance > CakePHP Conventions