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/table目录只是我自己创建的文件夹)中,我放置了所有ORM表模型,使其与其他模型分离。

这样,我还重命名了我的表模型,例如从Model_Application>>Model_table_Application,然后我放置了一个table_name属性来匹配。

然后在我的控制器中,我可以用这个代码调用这个模型,

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

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

型号/表格/申请人.php

class Model_Table_Applicant extends ORM {
    protected $_table_name = 'applicants';
    protected $_has_many = array(
        'table_applicantSkill' => array()
    );
}

model/table/applientSkill.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>';
    }
}

我所期待的是,它会回复"亚历克斯",然后是它的技能列表,但它只是打印"亚历克斯"然后是错误消息

错误消息"where子句"中的未知列"table_applicationskill.table_application_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);
    }
}

在其他方面,您可能需要进一步修改,但在本地它是有效的,您应该了解这个想法。