【问题标题】:issue about selecting objects in an inheritance context in propel-symfony关于在 propel-symfony 的继承上下文中选择对象的问题
【发布时间】:2009-11-28 18:34:42
【问题描述】:

我有一个非常烦人的 symfony 1.2 和推进问题。
我有一个模型,我使用单表策略实现了继承。所以,这是我的模型的摘录:
广告(id、posted_date、描述) 然后是继承自 Ad 的 RealEstateAd(location, price, transaction_type) 和 JobAd(position, requirements, company)。

我想显示所有广告,但我想以不同于 JobAd 的方式显示 RealEstateAd。为了实现这一点,我为 RealEstateAd 使用了部分,为 JobAd 使用了部分。
所以,在行动中,我这样做了:

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

在模板中,我检查每个对象的类:

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

问题是 $allAds 数组中的对象类是 sfOutputEscaperObjectDecorator。 所以,什么都没有显示。

我该如何处理这个问题?有没有办法获得一个包含实际属于 RealEstateAd 或 JobAd 类的对象的数组?这里的补水过程是如何进行的?

【问题讨论】:

标签: php inheritance symfony1 propel


【解决方案1】:

sfOutputEscaperObjectDecorator 有一个raw method 来获取undelying 对象。

无论如何,你能做的最好的事情就是拥有三个不同的类别(我假设房地产和招聘广告都是模特)

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;在您的视图中而不检查对象类型。 (使用多态卢克)

【讨论】:

  • 非常感谢 gpilotino。 $add->getRawValue() 工作正常。实际上,我的推进模型中有 3 个类:Ad、RealEstateAd 和 JobAd。
【解决方案2】:

我对 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

【讨论】:

  • 这是一个有趣的选项盖伦。我终于知道我们可以通过使用 getRawValue() 方法访问装饰器 undelying 对象来获取对象类。
【解决方案3】:

我可能会误解一些东西,但除非你重载了 AdPeer::doSelect(),否则它只会返回一个 Ad 实例数组。

如果您要发布您的架构,我或其他人会更容易提供帮助,因为目前尚不清楚您是如何构建对象模型的。 RealEstateAd 是 schema.yml 中定义的推进类吗?还是您添加到 lib 的自定义类?

无论如何,AdPeer::doSelect* 只会返回 Ad,所以听起来您需要的是 AdPeer 中的自定义检索器。同样,有关您的架构的更多信息会有所帮助。

【讨论】:

  • 嗨,胡安,感谢您的宝贵时间。实际上, AdPeer::doSelect() 不返回 Ad 对象,而是 Ad 对象的装饰器。正如 gpilotino 指出的那样,可以使用 getRawValue() 方法获取底层对象。所以,在我的例子中,我可以这样做: $add->getRawValue();然后进行测试: if ($rawValue instanceof RealEstateAdd) { //... }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多