Cakephp错误:未在项目上定义图像关联

Cakephp错误:未在项目上定义图像关联,php,cakephp,cakephp-3.x,Php,Cakephp,Cakephp 3.x,我有一个带有“ProjectsManager”插件的CakePHP应用程序 src/Model/Table/ImagesTable.php: public function initialize(array $config) { ... $this->belongsToMany('ProjectsManager.Projects', [ 'className' => 'ProjectsManager.Projects', 'foreig

我有一个带有“ProjectsManager”插件的CakePHP应用程序

src/Model/Table/ImagesTable.php

public function initialize(array $config)
{
    ...
    $this->belongsToMany('ProjectsManager.Projects', [
        'className' => 'ProjectsManager.Projects',
        'foreignKey' => 'image_id',
        'targetForeignKey' => 'project_id',
        'joinTable' => 'images_projects'
    ]);
public function initialize(array $config)
{
    ...
    $this->hasMany('Images', [
        'className' => 'Images',
        'foreignKey' => 'project_id',
        'targetForeignKey' => 'image_id',
        'joinTable' => 'images_projects'
    ]);
    $this->hasOne('CoverImage', [
        'className' => 'Images',
        'bindingKey' => 'cover',
        'foreignKey' => 'id'
    ]);
    $this->paginate = [
        'fields' => ['Projects.title', 'Projects.slug', 'Projects.cover'],
        'conditions' => $where,
        'contain' => ['Images','CoverImage' => ['fields' => ['filename']]],
        'limit' => 15,
        'order' => ['id' => 'desc']
   ];
public function initialize()
{
    parent::initialize();
    $this->loadModel('ProjectsManager.Projects');
}
插件/ProjectsManager/src/Model/ProjectsTable.php

public function initialize(array $config)
{
    ...
    $this->belongsToMany('ProjectsManager.Projects', [
        'className' => 'ProjectsManager.Projects',
        'foreignKey' => 'image_id',
        'targetForeignKey' => 'project_id',
        'joinTable' => 'images_projects'
    ]);
public function initialize(array $config)
{
    ...
    $this->hasMany('Images', [
        'className' => 'Images',
        'foreignKey' => 'project_id',
        'targetForeignKey' => 'image_id',
        'joinTable' => 'images_projects'
    ]);
    $this->hasOne('CoverImage', [
        'className' => 'Images',
        'bindingKey' => 'cover',
        'foreignKey' => 'id'
    ]);
    $this->paginate = [
        'fields' => ['Projects.title', 'Projects.slug', 'Projects.cover'],
        'conditions' => $where,
        'contain' => ['Images','CoverImage' => ['fields' => ['filename']]],
        'limit' => 15,
        'order' => ['id' => 'desc']
   ];
public function initialize()
{
    parent::initialize();
    $this->loadModel('ProjectsManager.Projects');
}
插件/ProjectsManager/src/Controller/Publica/projectscocontroller.php

public function initialize(array $config)
{
    ...
    $this->belongsToMany('ProjectsManager.Projects', [
        'className' => 'ProjectsManager.Projects',
        'foreignKey' => 'image_id',
        'targetForeignKey' => 'project_id',
        'joinTable' => 'images_projects'
    ]);
public function initialize(array $config)
{
    ...
    $this->hasMany('Images', [
        'className' => 'Images',
        'foreignKey' => 'project_id',
        'targetForeignKey' => 'image_id',
        'joinTable' => 'images_projects'
    ]);
    $this->hasOne('CoverImage', [
        'className' => 'Images',
        'bindingKey' => 'cover',
        'foreignKey' => 'id'
    ]);
    $this->paginate = [
        'fields' => ['Projects.title', 'Projects.slug', 'Projects.cover'],
        'conditions' => $where,
        'contain' => ['Images','CoverImage' => ['fields' => ['filename']]],
        'limit' => 15,
        'order' => ['id' => 'desc']
   ];
public function initialize()
{
    parent::initialize();
    $this->loadModel('ProjectsManager.Projects');
}
所以,在我的控制器中,我想加载所有项目和相关的图像,看看上面的代码。运行此命令会导致错误:

未在项目上定义图像关联

因此,我一直在搜索和阅读,发现我需要前缀插件,使其工作。所以我做了代码中可以看到的事情。然而,错误依然存在


有什么想法吗?

经过一番尝试,我找到了解决办法

在应用程序控制器(例如ImagesController.php)中,当您使用
$this->Images->……
时,它会工作。使用该代码,将调用ImagesModel

在插件内部,这不起作用。。。或者至少,ProjectsModel没有被调用

因此,我需要通过将以下代码添加到projectscoontroller.php,手动加载模型:

public function initialize(array $config)
{
    ...
    $this->belongsToMany('ProjectsManager.Projects', [
        'className' => 'ProjectsManager.Projects',
        'foreignKey' => 'image_id',
        'targetForeignKey' => 'project_id',
        'joinTable' => 'images_projects'
    ]);
public function initialize(array $config)
{
    ...
    $this->hasMany('Images', [
        'className' => 'Images',
        'foreignKey' => 'project_id',
        'targetForeignKey' => 'image_id',
        'joinTable' => 'images_projects'
    ]);
    $this->hasOne('CoverImage', [
        'className' => 'Images',
        'bindingKey' => 'cover',
        'foreignKey' => 'id'
    ]);
    $this->paginate = [
        'fields' => ['Projects.title', 'Projects.slug', 'Projects.cover'],
        'conditions' => $where,
        'contain' => ['Images','CoverImage' => ['fields' => ['filename']]],
        'limit' => 15,
        'order' => ['id' => 'desc']
   ];
public function initialize()
{
    parent::initialize();
    $this->loadModel('ProjectsManager.Projects');
}

你必须添加插件前缀在你有很多关联调用插件的模型表文件。有关详细信息,请参阅此链接。@Ishanvyas2,我在ImageTable.php中这样做了。如果我要将其添加到ProjectsTable中,我如何引用“main”应用程序?