Cakephp 3属于ToMany导致未定义的偏移量/索引

时间:2015-07-27 12:25:22

标签: php cakephp cakephp-3.0

我有“Groups”和“Servers”表,我需要通过多对多关系加入。 我在数据库“mn_groups_servers”中创建了第三个表,列为idgroup_idserver_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。

原因可能是什么?

1 个答案:

答案 0 :(得分:2)

从错误和代码判断,看起来您的数据库表没有设置主键约束,这是CakePHP找到应作为主键的列所必需的,除非您明确指定哪个列(s)应该使用。

id列添加适当的约束,它应该有效(不要忘记之后清除模型缓存src/tmp/cache/models)。

使用Table::primaryKey()方法明确告诉表类可以使用哪些列。

// in your tables initialize() method
$this->primaryKey('id');

但是,这应该主要只是另外(这将避免处理架构),而不是!你的表确实应该设置PK约束,除非你有非常的理由不使用它们!

另见