Intereting Posts
разница между $ query> num_rows () и $ this-> db-> count_all_results () в CodeIgniter и которая рекомендуется Используйте токен обновления OAuth для получения нового токена доступа – API Google Выполнить код, когда модель Eloquent извлекается из базы данных PHP для Delphi и обратно Шифрование-Расшифровка с использованием Rijndael Laravel 4: использование контроллера для переадресации страницы, если сообщение не существует. Использование собственного SQL-запроса без класса сущности Codeigniter base_url () не работает должным образом для ajax Выключатель SVG / PNG PHP Curl получить ответ сервера Как отправить электронную почту с арабским контентом через почтовую функцию PHP? Symfony2 – Доктрина и FOSUserBundle – неправильные аннотации usort (): Массив был изменен функцией сравнения пользователей Как использовать preg_replace_callback? PHP – Различия между `get_headers` и` stream_get_meta_data`? Как передать массив из контроллера для просмотра (Laravel 5)?

Проблема с сохранением одиночной таблицы Propel

У меня есть таблица под названием «talk», которая определяется как абстрактный в моем файле schema.xml.

Он генерирует 4 объекта (1 для каждого класса): Комментарий, Рейтинг, Обзор, Проверка

Он также генерирует TalkPeer, но я не мог получить его для создания других 4-х сверстников (CommentPeer, RatingPeer, ReviewPeer, CheckinPeer), поэтому я создал их вручную и наследовал их от TalkPeer.php, который наследуется от BaseTalkPeer. Затем я реализовал getOMClass () в каждом из этих одноранговых узлов.

Проблема в том, что когда я выполняю запросы с использованием 4-х равных, они возвращают все 4 типа объектов. То есть, ReviewPeer вернет визиты, рейтинги, комментарии и отзывы.

Пример:

$c = new Criteria(); $c->add(RatingPeer::VALUE, 5, Criteria::GREATER_THAN); $positive_ratings = RatingPeer::doSelect($c); 

Это возвращает все комментарии, оценки, обзоры и проверки, которые имеют значение> 5.

ReviewPeer должен только возвращать объекты Review, и не может понять, как это сделать.

Мне действительно нужно пройти и изменить все мои критерии, чтобы вручную указать класс? Это кажется немного бессмысленным, поскольку имя Peer уже отличается. Я не хочу настраивать каждого пэра. Я должен быть в состоянии настроить JUST TalkPeer, так как они все наследуют от него … Я просто не могу понять, как это сделать.

Я попытался изменить doSelectStmt только в TalkPeer, чтобы он автоматически добавлял ограничение CLASSKEY к критериям. Он почти работает, но я получаю: Неустранимая ошибка: невозможно создать экземпляр абстрактного класса в /models/om/BaseTalkPeer.php в строке 503. Строка 503 находится в BaseTalkPeer :: populateObjects () и является третьей строкой ниже:

 $cls = TalkPeer::getOMClass($row, 0); $cls = substr('.'.$cls, strrpos('.'.$cls, '.') + 1); $obj = new $cls(); 

В документах говорилось об переопределении BaseTalkPeer :: populateObject () . У меня такое чувство, что это моя проблема , но даже после прочтения исходного кода я все еще не мог понять, как заставить его работать.

Вот что я пробовал в TalkPeer :: doSelectStmt:

  public static function doSelectStmt(Criteria $criteria, PropelPDO $con = null) { $keys = array('models.Visit'=>1,'models.Comment'=>2,'models.Rating'=>3,'models.Review'=>4); $class_name = self::getOMClass(); if(isset($keys[$class_name])) { //Talk itself is not a returnable type, so we must check $class_key = $keys[$class_name]; $criteria->add(TalkPeer::CLASS_KEY, $class_key); } return parent::doSelectStmt($criteria, $con = null); } 

Вот пример моего метода getOMClass из ReviewPeer:

 public static function getOMClass() { return self::CLASSNAME_4; //aka 'talk.Review'; } 

Вот соответствующий бит моей схемы:

 <table name="talk" idMethod="native" abstract="true"> <column name="talk_pk" type="INTEGER" required="true" autoIncrement="true" primaryKey="true" /> <column name="class_key" type="INTEGER" required="true" default="" inheritance="single"> <inheritance key="1" class="Visit" extends="models.Talk" /> <inheritance key="2" class="Comment" extends="models.Talk" /> <inheritance key="3" class="Rating" extends="models.Talk" /> <inheritance key="4" class="Review" extends="models.Rating" /> </column> </table> 

PS – Нет, я не могу обновить с 1.3 до 1.4. Существует слишком много кода, который нужно будет повторно протестировать

Почему бы вам просто не удалить абстрактные = истинные утверждения, чтобы вы сгенерировали все сверстники, а затем снова добавили абстрактный текст, сгенерировали еще раз, чтобы получить db в точности так, как вам нравится?

Ive никогда не использовал наследование в Propel, но вы должны иметь возможность модифицировать методы doSelectRS для каждого класса Peer, чтобы изменить критерии и указать дополнительное условие для ключа наследования. У меня нет документов перед передо мной, но в псевдокоде он выглядит примерно так:

 public static function doSelectRS(Criteria $c) { // you may want to check if the condition already exists in one of the criterion's before doing the following... $c->add(RatingPeer::TYPE, 3); return parent::doSelectRS($c); }