首页 > 解决方案 > 在自定义类内的查询中获取关联数据时出错。CakePHP 3.x

问题描述

我试图在我的自定义类 CstmGroupsClass 中的查询中加载关联的数据,但我收到错误“图书关联未在库上定义”。它工作的唯一方法是在控制器中编写 loadModel('CstmLibraries') 并将别名更改为模型与原始模型的关系,例如 hasMany('Books',...) 到 hasMany('CstmBooks',. ..)。但是我需要能够在自定义类中执行查询,并且在其中我不能使用 loadModel() 并且 tableRegistry 不能解决问题。

谢谢您的帮助。

CstmGroupsClass.php

class CstmGroupsClass {

    protected $CstmGroups;

    function __construct() {        
        $this->CstmGroups = TableRegistry::get('CstmGroups');
    }

    public function listGroups($contain = []) { //Value of $contain: ['Libraries','Libraries.Books']       
        $listGroups = $this->CstmGroups->find()->contain($contain);
        return $listGroups->execute(); /* <= Here the error is produced */       
    }
}

CstmGroupsController.php

class CstmGroupsController extends AppController {

    private $cstmGroupsClass;

    public function initialize() {  
        $this->cstmGroupsClass = new CstmGroupsClass();
    }

    public function listGroups() {

        $responseListGroups = $this->cstmGroupsClass->listGroups(['Libraries','Libraries.Books']);

        $this->set(compact('responseListGroups'));
    }
}

CstmGroupsTable.php

class CstmGroupsTable extends Table {

    public $prefix = 'cstm_';

    public function initialize(array $config) {
        parent::initialize($config);

        $this->setTable($this->prefix.'groups'); //final name: cstm_groups
        $this->setPrimaryKey('id');

        $this->hasOne('Libraries', [
            'className' => $this->prefix.'libraries', //final name: cstm_libraries
            'foreignKey' => 'group_id'
        ]);
    }
}

CstmLibrariesTable.php

class CstmLibrariesTable extends Table
{
    public $prefix = 'cstm_';

    public function initialize(array $config){
        parent::initialize($config);

        $this->setTable($this->prefix.'libraries'); //final name: cstm_libraries
        $this->setPrimaryKey('id');

        $this->hasOne('Groups',[
            'className' => $this->prefix.'groups', //final name: cstm_groups
            'foreignKey' => 'library_id'
        ]);

        $this->hasMany('Books', [
            'className' => $this->prefix.'books', //final name: cstm_books
            'foreignKey' => 'library_id'
        ]);
    }
}

CstmBooksTable.php

class CstmBooksTable extends Table {

    public $prefix = 'cstm_';

    public function initialize(array $config) {
        parent::initialize($config);

        $this->setTable($this->prefix.'books'); //final name: cstm_books
        $this->setPrimaryKey('id');

        $this->belongsTo('Libraries', [
            'className' => $this->prefix.'libraries', //final name: cstm_libraries
            'foreignKey' => 'library_id'
        ]);
    }
}

标签: phpcakephp-3.0

解决方案


推荐阅读