проблема выбора объектов в контексте наследования в propel-symfony - PullRequest
0 голосов
/ 28 ноября 2009

У меня проблема с symfony 1.2 и propel, которая очень раздражает.
У меня есть модель, в которой я реализовал наследование, используя стратегию единой таблицы. Итак, вот выдержка из моей модели:
Объявление (идентификатор, дата публикации, описание) затем RealEstateAd (местоположение, цена, тип транзакции) и JobAd (позиция, требования, компания), которые наследуют оба от Ad.

Я хотел бы отобразить все объявления, но я бы хотел, чтобы RealEstateAd отличался от JobAd. Для достижения этого я использовал частичное для RealEstateAd и частичное для JobAd.
Итак, в действии я сделал это:

$c = new Criteria();  
$this->allAds = AdPeer::doSelect($c);

В шаблоне я проверяю класс каждого объекта:

$add = $allAds[$i];
if ($add instanceof RealEstateAdd)
  //Use the RealEstatePartial

Проблема в том, что классом объекта в массиве $ allAds является sfOutputEscaperObjectDecorator. Итак, вообще ничего не отображается.

Как я мог решить эту проблему? Есть ли способ получить массив с объектами, которые на самом деле из класса RealEstateAd или JobAd? Как здесь происходит процесс увлажнения?

Ответы [ 3 ]

1 голос
/ 30 ноября 2009

sfOutputEscaperObjectDecorator имеет необработанный метод для получения неподходящего объекта.

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

class Ad { public function __toString() { print 'ad'; } } 

class RealEstates extends Ad { public function __toString() { print 'realad'; } }

class JobAd extends Ad { public function __toString() { print 'jobad'; } } 

так что вы можете просто позвонить print $ myAd; по вашему мнению, без проверки типов объектов. (используйте полиморфизм Люка)

0 голосов
/ 29 ноября 2009

Возможно, я что-то неправильно понял, но если вы не перегружаете AdPeer :: doSelect (), он вернет только массив экземпляров Ad.

Если бы вы опубликовали свою схему, мне или другим было бы легче помочь, поскольку не совсем понятно, как вы создали свою объектную модель. Является ли RealEstateAd классом propel, определенным в schema.yml? или это пользовательский класс, который вы добавили в lib?

В любом случае, AdPeer :: doSelect * будет возвращать только Ad, поэтому, похоже, вам нужен пользовательский ретривер в AdPeer. Опять же, больше информации о вашей схеме поможет.

0 голосов
/ 28 ноября 2009

Я не знаю много о Symfony или Propel, так что если я здесь далеко от базы, я извиняюсь и просто игнорирую этот пост ...

Что делать, если вы создаете вспомогательную функцию getAdType(), которая использует некоторую методологию для различения различных типов рекламы.

function getAdType( $ad ) {

    if ( isset( $ad->position ) ) {
        return 'job';
    }
    elseif ( isset( $ad->transaction_type ) ) {
        return 'realestate';
    }

}

$add = $allAds[$i];
if ( getAdType( $add ) == 'realestate' )
    //Use the RealEstatePartial
...