我有“Groups”和“Servers”表,我需要通过多对多关系加入。
我在数据库“mn_groups_servers”中创建了第三个表,列为id
,group_id
和server_id
。
我添加到GroupsTable:
public function initialize(array $config) {
parent::initialize($config);
$this->table('mn_groups');
$this->belongsToMany('Servers', [
'joinTable' => 'mn_groups_servers',
'foreignKey' => 'group_id',
'targetForeignKey' => 'server_id',
]);
}
到ServersTable:
public function initialize(array $config) {
parent::initialize($config);
$this->table('mn_servers');
$this->belongsToMany('Groups', [
'joinTable' => 'mn_groups_servers',
'foreignKey' => 'server_id',
'targetForeignKey' => 'group_id',
]);
}
然后在GroupsController中我尝试使用:
获取结果 public function index() {
$groups = $this->Groups->find('all')->contain('Servers');
$this->set(compact('groups'));
}
这导致两个错误:
Notice (8): Undefined offset: 0 [CORE\src\ORM\Association\SelectableAssociationTrait.php, line 286]
Cake\ORM\Association\BelongsToMany::_resultInjector() - CORE\src\ORM\Association\SelectableAssociationTrait.php, line 286
Cake\ORM\Association\BelongsToMany::eagerLoader() - CORE\src\ORM\Association\SelectableAssociationTrait.php, line 57
Cake\ORM\EagerLoader::loadExternal() - CORE\src\ORM\EagerLoader.php, line 542
Cake\ORM\Query::_execute() - CORE\src\ORM\Query.php, line 657
Cake\ORM\Query::_all() - CORE\src\Datasource\QueryTrait.php, line 218
Cake\ORM\Query::all() - CORE\src\ORM\Query.php, line 608
Cake\ORM\Query::getIterator() - CORE\src\Datasource\QueryTrait.php, line 132
include - APP/Template\Groups\index.ctp, line 10
Cake\View\View::_evaluate() - CORE\src\View\View.php, line 834
Cake\View\View::_render() - CORE\src\View\View.php, line 794
Cake\View\View::render() - CORE\src\View\View.php, line 465
Cake\Controller\Controller::render() - CORE\src\Controller\Controller.php, line 582
Cake\Routing\Dispatcher::_invoke() - CORE\src\Routing\Dispatcher.php, line 120
Cake\Routing\Dispatcher::dispatch() - CORE\src\Routing\Dispatcher.php, line 87
require - ROOT\webroot\index.php, line 37
[main] - ROOT\index.php, line 16
和
Notice (8): Undefined index: [CORE\src\ORM\Association\SelectableAssociationTrait.php, line 288]
Cake\ORM\Association\BelongsToMany::Cake\ORM\Association\{closure}() - CORE\src\ORM\Association\SelectableAssociationTrait.php, line 288
Cake\Database\Statement\CallbackStatement::fetch() - CORE\src\Database\Statement\CallbackStatement.php, line 58
Cake\ORM\ResultSet::_fetchResult() - CORE\src\ORM\ResultSet.php, line 477
Cake\ORM\ResultSet::valid() - CORE\src\ORM\ResultSet.php, line 269
include - APP/Template\Groups\index.ctp, line 10
Cake\View\View::_evaluate() - CORE\src\View\View.php, line 834
Cake\View\View::_render() - CORE\src\View\View.php, line 794
Cake\View\View::render() - CORE\src\View\View.php, line 465
Cake\Controller\Controller::render() - CORE\src\Controller\Controller.php, line 582
Cake\Routing\Dispatcher::_invoke() - CORE\src\Routing\Dispatcher.php, line 120
Cake\Routing\Dispatcher::dispatch() - CORE\src\Routing\Dispatcher.php, line 87
require - ROOT\webroot\index.php, line 37
[main] - ROOT\index.php, line 16
Cake仍然提取Groups
表对象,但没有来自Servers
表的结果。
请注意,对于数据库组织的表,我有前缀mn
。
我尝试了没有前缀的关联,结果相同。
我也在使用SQL Server数据库。
我的蛋糕版本是3.0.10。
原因可能是什么?
答案 0 :(得分:2)
从错误和代码判断,看起来您的数据库表没有设置主键约束,这是CakePHP找到应作为主键的列所必需的,除非您明确指定哪个列(s)应该使用。
为id
列添加适当的约束,它应该有效(不要忘记之后清除模型缓存src/tmp/cache/models
)。
使用Table::primaryKey()
方法明确告诉表类可以使用哪些列。
// in your tables initialize() method
$this->primaryKey('id');
但是,这应该主要只是另外(这将避免处理架构),而不是!你的表确实应该设置PK约束,除非你有非常的理由不使用它们!
另见