有人能告诉我如何使用Propel ModelCriteria获得间接相关的类吗?

时间:2011-11-17 11:31:34

标签: php orm propel

如果可能的话,我想得到社区的一些帮助。

我们正在开展一个项目,现在是重构的时候了。我们使用PHP 5和Propel 1.6作为ORM层。实际上,这个想法非常简单:我们试图同时获取所有相关信息。

但是,此信息并不总是与主类(或换句话说,与主表)直接相关。例如:

return (
$this->leftJoin( "IES.Pessoa mant" )
    ->leftJoin( "mant.Papel subpapel" )
        ->where( "subpapel.tipo = ?", Tipo_papel::IES )
        ->leftJoin( "subpapel.RelacionamentoRelatedByIdSubPapel relm" )
            ->where( "relm.tipo = ?", Tipo_relacionamento::MANTENEDORA_IES )
            ->leftJoin( "relm.PapelRelatedByIdSuperPapel superpapel" )
                ->leftJoinWith( "superpapel.Pessoa iesm" )
                ->where( 'superpapel.tipo = ?', Tipo_papel::MANTENEDORA_IES )
);

这是我们的模型层中ModelCriteria中函数的代码。我们的想法是获得与'IES'相关的'iesm'。

但是,我们遇到了一个问题。碰巧'IES'已经与一个实体'Pessoa'有关。因此,当应用此代码时,此对象将丢失,为与'iesm'相关的实体'Pessoa'提供空间。

所以基本的问题是:我想在'IES'对象中设置属性'iesm',而不是因为Propel映射而设置的Pessoa。话虽这么说,我怎么能这样做?它甚至可能吗?我想根据在leftJoinWith上创建的别名来设置'iesm'。

另一个问题,在此之后立即显示:如果数据库中没有直接关系,我如何使用相同的想法设置此对象?试图更好地解释:这个'iesm'实际上是'Pessoa_juridica'类型的对象。 'Pessoa_juridica'与'IES'没有直接关系。怎么可能将'Pessoa_juridica'设置在'IES'对象中?

我甚至不知道这是否是使用它的最佳方式,所以欢迎任何其他想法。如果您想进一步解释,请告诉我。

1 个答案:

答案 0 :(得分:0)

好的,我想我不知道你在处理什么:你有什么优化数据库连接但发现,因为你需要加入两个不同的无关表和另一个以某种方式连接它们的表。

我在这种情况下的建议是:

  1. 尝试将UNION与自定义查询一起使用。因此,创建两个标准并使用UNION合并结果,为此工作所选字段,两个表的大小和类型应相同。我不知道如何使用Query objets来做到这一点,但我很确定它可以使用Peer类来完成。请查看此链接UNION query with Propel ORM

  2. 不要隐藏所有的objets。有时,使用语句(如doSelectStmt())并从单独的数据库查询中获取信息作为数组更有效,更清晰,操作它们,然后只对您将要使用的对象进行水合。

  3. 请记住,symfoyn还有一个缓存(例如APC),在处理真正的大表,复杂信息和重复信息时,这总是一个好主意。