【发布时间】:2010-01-14 20:32:32
【问题描述】:
我有一个名为“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 的所有 cmets、评级、评论和签到。
ReviewPeer 应该只返回 Review 对象,并且无法计算 了解如何做到这一点。
我是否真的必须通过并更改所有条件才能手动指定类键? 这似乎有点毫无意义,因为 Peer 名称已经不同了。 我不想自定义每个 Peer。我应该能够自定义 TalkPeer,因为它们都继承自它......我只是不知道如何。
我尝试仅在 TalkPeer 中更改 doSelectStmt,以便它自动将 CLASSKEY 限制添加到 Criteria。它几乎可以工作,但我得到一个:致命错误:无法在第 503 行的 /models/om/BaseTalkPeer.php 中实例化抽象类 Talk。第 503 行在 BaseTalkPeer::populateObjects() 中,并且是下面的第 3 行:
$cls = TalkPeer::getOMClass($row, 0);
$cls = substr('.'.$cls, strrpos('.'.$cls, '.') + 1);
$obj = new $cls();
docs talked about overriding 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);
}
这是我的来自 ReviewPeer 的 getOMClass 方法的示例:
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>
附: - 不,我不能从 1.3 升级到 1.4。太多了 需要重新测试的代码
【问题讨论】:
标签: php orm propel single-table-inheritance