【问题标题】:Kohana ORM - Incorrect table nameKohana ORM - 表名不正确
【发布时间】:2012-11-17 15:37:32
【问题描述】:

我对 Kohana (3.2) ORM 查询构建器有一个奇怪的问题,我不知道出了什么问题。我得到“不正确的表名”异常:

  Database_Exception [ 1103 ]: Incorrect table name '' [ SELECT ``.* FROM `` JOIN `user_plugins` ON (`user_plugins`.`plugin_id` = ``.`id`) WHERE `user_plugins`.`user_id` = '9' ]

如您所见,查询中的表为空。

控制器:

  $user = ORM::factory('user', Auth::instance()->get_user()->id);

  if ($user->loaded() ) 
  {
     $result = $user->plugin->find_all();
  }

用户模型:

  class Model_User extends Useradmin_Model_User
  {
    protected $_has_many = array(
      'plugin' => array( 'through' => 'user_plugins'),
    );
  ...

user_plugin 模型

  class Model_user_plugin extends ORM
  {
     protected $_belongs_to = array(
         'plugin' => array(),
         'user' => array()
     );
  ...

插件模型

  class Model_Plugin extends ORM
  {
     protected $_has_many = array(
         'user' => array('through' => 'user_plugins')
     );
  ...

有人知道这里有什么问题吗? 非常感谢任何帮助!

【问题讨论】:

  • Useradmin_Model_User 中有什么内容? PS。为什么你使用单数形式的关系名称?应该是usersplugins 等。
  • 感谢您的回复。我正在使用带有一些小修复的 Mixu Useradmin 模块(主要是为了使其与 Kohana 3.2 兼容)。你可以在这里找到源代码:github.com/mixu/useradmin/blob/master/classes/useradmin/model/…
  • 你能告诉我var_dump($user)的结果吗?
  • 嗯,这很奇怪。我已将此问题跟踪到 Kohana_ORM 类中的 __get 函数。当$model = ORM::factory($this->_has_many[$column]['model']); 行设置相关模型时(在 Kohana_ORM 中的第 580 行附近),_object_name 变量设置不正确,稍后用于创建第二个连接列$join_col2 = $model->_object_name . '.' . $model->_primary_key; 知道为什么会失败吗?这是 $user 的转储:pastebin.com/U63JMaR0,这里是创建的 $model 对象的转储:pastebin.com/EXATcFLr
  • 也许你改变了Plugin的_initialize()方法? Model_Plugin 代码是什么?

标签: php kohana kohana-3 kohana-orm kohana-3.2


【解决方案1】:

用户模型应该是这样的

class Model_User extends Useradmin_Model_User
{
   protected $_has_many = array(
      'plugin' => array('model' => 'plugin', 'through' => 'user_plugins'),
   );
...

插件模型应该是这样的

class Model_Plugin extends ORM
{
    protected $_has_many = array(
        'user' => array('model' => 'user', 'through' => 'user_plugins')
    );

你根本不需要 user_plugin 模型,两个模型中的“user_plugins”指的是表名,而不是模型名。只需确保您拥有包含以下字段的 user_plugins 表,

id、user_id、plugin_id

我希望这会有所帮助。

【讨论】:

  • 我对我的植入进行了一些更改,并且知道即使没有设置 $_object_name 也可以正常工作。我不是 100% 确定是什么原因造成的,但现在它起作用了,所以我很高兴 :)
【解决方案2】:

按照惯例,$_has_many 必须始终使用复数名称,除非您在目标模型中指定 $_object_name 中的名称。所以应该是:

class Model_Plugin extends ORM
{
  protected $_has_many = array(
     'users' => array('through' => 'users_plugins')
  );
  //...
class Model_User extends ORM
{
  protected $_has_many = array(
     'plugins' => array('through' => 'users_plugins')
  );
  //...
class Model_user_plugin extends ORM
{
  protected $_belongs_to = array(
     'plugin' => array(),
     'user' => array()
  );
  //...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-22
    • 1970-01-01
    • 2012-12-11
    • 2011-10-23
    • 2011-08-06
    相关资源
    最近更新 更多