Kohana 3.2, вызывая модели таблиц ORM (с отношением has_many), которые помещаются в подпапку

Я пытался организовать свои коды, в Применение / классы / модель / таблица / (Таблица каталог просто моя собственная папка), Я поместил все модели таблиц 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» и сообщение об ошибке.

Сообщение об ошибке
Неизвестный столбец ‘table_applicantskill.table_applicant_id’ в ‘предложении where’ [SELECT table_applicantskill………..

0

Решение

Как вы работаете с ORM было бы целесообразно написать свой собственный класс, который содержит важные методы — главным образом удаляя Таблица_ префикс из значений.

Для этого просто создайте файл 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);
}
}

Возможно, вам придется изменить это немного дальше в других точках, но локально это работает, и вы должны понять.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]