【问题标题】:CakePhp 2.x - plugin model is not being loadedCakePhp 2.x - 插件模型没有被加载
【发布时间】:2014-04-24 10:15:33
【问题描述】:

我在 CakePhp 中制作了一个插件,我在插件中使用了多个模型。我使用控制台创建了这些模型并烘焙了它们。我在使用其中一种时遇到了问题,它只出现在这个特定的模型中。

模型文件名:
GamificationBadgeUnlockActionProgression.php

模型内容:

<?php
    App::uses('GamificationAppModel', 'Gamification.Model');

    class GamificationBadgeUnlockActionProgression extends GamificationAppModel {

    function __construct() {
        parent::__construct();
        echo 'oleej';
        exit;
    }

    public $belongsTo = array(
        'GamificationBadgeProgression' => array(
            'className' => 'GamificationBadgeProgression',
            'foreignKey' => 'gamification_badge_progression_id'
        ),
        'GamificationBadgeUnlockAction' => array(
            'className' => 'GamificationBadgeUnlockAction',
            'foreignKey' => 'gamification_badge_unlock_action_id'
        )
    );

    public function addMissingProgression($missingProgression)
    {
        /*$this->saveMany($missingProgression, array(
            'fieldlist' => array('gamification_badge_progression_id', 'gamification_badge_unlock_action_id')
        ));*/
    }
}

在我拥有的插件控制器中:

public $uses = array('Gamification.GamificationBadge',
    'Gamification.GamificationBadgeProgression', 
    'Gamification.GamificationBadgeUnlockAction',
    'Gamification.GamificationBadgeUnlockActionProgression', 
    'Gamification.GamificationBadgeUnlockType');

正在加载所有其他模型,“Gamification.GamificationBadgeUnlockActionProgression”除外。这很奇怪。它具有所有必需的东西,并且遵循命名约定和一切。 它只是没有被加载,因为构造函数从未被调用并且 echo 从未显示。

当我像这样使用数组作为参数从模型中调用函数时:

    $this->GamificationBadgeUnlockActionProgression->addMissingProgression($missingProgression);

然后我得到一个错误

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'addMissingProgression' at line 1

因为模型没有加载。
但是 CakePhp 确实创建了一个同名的魔术模型,这导致了上面的错误,因为模型神奇地存在,但函数当然不存在,关系也不存在。

我在这里错过了什么?

【问题讨论】:

  • 您可以通过ClassRegistry::isKeySet('Name of your model');查看模型是否加载的天气
  • 是的,因为 cakephp 创造了它的神奇版本

标签: php cakephp cakephp-2.0 mysql-error-1064


【解决方案1】:

当模型没有正确加载时会引发这种错误,它会尝试将方法作为 SQL 函数执行,这显然不存在。在控制器的顶部,检查它是否有:

App::uses('GamificationBadgeUnlockActionProgression', 'Gamification.Model');

加上你已经拥有的 $uses 数组中的Gamification.GamificationBadgeUnlockActionProgression 应该足以加载它。如果它仍然失败,作为最后的手段,您可以使用以下后备手动将其加载到您的方法中:

if (!is_object($this->GamificationBadgeUnlockActionProgression)) {
    ClassRegistry::init('Gamification.GamificationBadgeUnlockActionProgression');
    $this->GamificationBadgeUnlockActionProgression = new GamificationBadgeUnlockActionProgression();
}

这将手动加载模型并在$this-&gt;GamificationBadgeUnlockActionProgression 下为其创建一个实例。

模型中的关联似乎也有错误,它应该包括插件前缀,例如:

public $belongsTo = array(
    'GamificationBadgeProgression' => array(
        'className' => 'Gamification.GamificationBadgeProgression',
        'foreignKey' => 'gamification_badge_progression_id'
    ),
    'GamificationBadgeUnlockAction' => array(
        'className' => 'Gamification.GamificationBadgeUnlockAction',
        'foreignKey' => 'gamification_badge_unlock_action_id'
    )
);

【讨论】:

  • 如果有效则无。而且手动加载也不起作用,因为 CakePHP 创建了一个具有相同名称的魔术模型。我可以使用所有默认函数,如 $this->GamificationBadgeUnlockActionProgression->find('all'),但我无法创建我的 then ofcourse
  • 更好的是,当我尝试按照您所说的手动加载它时,应该可以返回错误:找不到类'GamificationBadgeUnlockActionProgression'
  • @DijkeMark 可能与我刚刚在您的模型中发现的错误有关,它可能导致模型无法正确加载,因为关联似乎已关闭。请参阅我的更新答案以解决此问题。
  • 好的,它现在似乎可以工作了。在类名之前添加插件就可以了。仍然很奇怪,因为插件中的其他模型不需要它来使其工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-10
  • 2017-09-29
  • 2020-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多