繁体   English   中英

Kohana 3.2,调用放在子文件夹中的ORM表模型(具有has_many关系)

[英]Kohana 3.2, calling ORM table models(with has_many relationship) that are put inside a subfolder

我试图组织代码,在application / classes / model / table / 目录只是我自己创建的文件夹 )中,我把所有的ORM表模型都与其他模型分开了。

这样,我还重命名了表模型,例如从Model_Applicant >> Model_Table_Applicant重命名,然后放置table_name属性进行匹配。

然后在控制器中,我可以通过以下代码调用此模型,

$applicantModel = ORM::factory('table_applicant');

我的问题是,Model_Table_Applicant包含has_many属性,我无法迭代值。(对不起,我无法真正用语言表达它,所以我只会发布我的代码)。

模型/表/ applicant.php

class Model_Table_Applicant extends ORM {

    protected $_table_name = 'applicants';

    protected $_has_many = array(
        'table_applicantSkill' => array()
    );
}

模型/表/ applicantSkill.php

class Model_Table_ApplicantSkill extends ORM {

    protected $_table_name = 'applicant_skills';

}

在我的控制器中

public function action_testing() {
    $applicantModel = ORM::factory('table_applicant');
    foreach ($applicantModel->find_all() as $applicant) {
        echo $applicant->firstName.'<br>';
        echo '<ul>';
        foreach ($applicant->table_applicantSkill->find_all() as $applicantSkill) {
            echo '<li>'.$applicantSkill->skill.'</li>';
        }
        echo '</ul>';
    }
}

我所期望的是,它将回显“ Alex”,然后显示其技能列表,但只显示“ Alex”,然后显示错误消息

错误消息 “ where子句”中的未知列“ table_applicantskill.table_applicant_id” [SELECT table_applicantskill ...........

在使用ORM时,编写自己的包含重要方法的类很有意义-主要是从值中删除table_前缀。

为此,只需创建一个文件APPPATH / classes / ORM.php。 此处的重要方法是_initialize() ,在此设置了表名,外键以及其他值。

只是让Kohana做它的事情,并在必要时删除前缀,就像这样

class ORM extends Kohana_ORM
{
    protected static function remove_table_prefix($value)
    {
        $pattern = '/^table_(.*)$/i';
        $replace = '\\1';

        if (is_string($value))
        {
            return preg_replace($pattern, $replace, $value);
        }
        elseif (is_array($value))
        {
            foreach ($value as &$details)
            {
                $details['foreign_key'] = self::remove_table_prefix($details['foreign_key']);
            }
            return $value;
        }
        return $value;
    }

    protected function _initialize()
    {
        parent::_initialize();

        // remove "table_"
        $this->_table_name = self::remove_table_prefix($this->_table_name);
        $this->_belongs_to = self::remove_table_prefix($this->_belongs_to);
        $this->_has_one = self::remove_table_prefix($this->_has_one);
        $this->_has_many = self::remove_table_prefix($this->_has_many);
    }
}

您可能需要在其他方面做一些进一步的修改,但是在本地还是可行的,您应该了解一下。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM