Kohana 3.2,调用放在子文件夹中的 ORM table 模型(具有 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 table 模型和其他模型分开
有了这个,我也重命名了我的 table 模型,例如从 Model_Applicant >> Model_Table_Applicant 然后我放了一个 table_name 属性 来匹配.
然后在我的控制器中,我可以通过这段代码调用这个模型,
$applicantModel = ORM::factory('table_applicant');
我的问题是,Model_Table_Applicant 包含 has_many 属性,我无法迭代这些值。(抱歉,我无法用语言表达,所以我只 post 我的代码)。
model/table/applicant.php
class Model_Table_Applicant extends ORM {
protected $_table_name = 'applicants';
protected $_has_many = array(
'table_applicantSkill' => array()
);
}
model/table/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 clause' [SELECT table_applicantskill
中的未知列 'table_applicantskill.table_applicant_id' .....................
当您使用 ORM
时,编写您自己的包含重要方法的 class 是有意义的 - 主要是删除 table_ 来自值的前缀。
为此,只需创建一个文件 APPPATH/classes/ORM.php。这里重要的方法是_initialize()
,这里设置了table名称,外键以及其他值。
只要让 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);
}
}
您可能需要在其他地方进一步修改它,但它在本地有效,您应该明白了。
我试图组织我的代码,在 application/classes/model/table/ (table 目录就是我自己创建的文件夹), 我把所有的ORM table 模型和其他模型分开
有了这个,我也重命名了我的 table 模型,例如从 Model_Applicant >> Model_Table_Applicant 然后我放了一个 table_name 属性 来匹配.
然后在我的控制器中,我可以通过这段代码调用这个模型,
$applicantModel = ORM::factory('table_applicant');
我的问题是,Model_Table_Applicant 包含 has_many 属性,我无法迭代这些值。(抱歉,我无法用语言表达,所以我只 post 我的代码)。
model/table/applicant.php
class Model_Table_Applicant extends ORM {
protected $_table_name = 'applicants';
protected $_has_many = array(
'table_applicantSkill' => array()
);
}
model/table/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 clause' [SELECT table_applicantskill
中的未知列 'table_applicantskill.table_applicant_id' .....................
当您使用 ORM
时,编写您自己的包含重要方法的 class 是有意义的 - 主要是删除 table_ 来自值的前缀。
为此,只需创建一个文件 APPPATH/classes/ORM.php。这里重要的方法是_initialize()
,这里设置了table名称,外键以及其他值。
只要让 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);
}
}
您可能需要在其他地方进一步修改它,但它在本地有效,您应该明白了。