在 Symfony 2 中使用 Doctrine 2 中的视图

Posted

技术标签:

【中文标题】在 Symfony 2 中使用 Doctrine 2 中的视图【英文标题】:Using Views in Doctrine 2 with Symfony 2 【发布时间】:2011-10-17 07:59:27 【问题描述】:

我有一个订单数据库(简化版): 订单:id, shipping, discount, date order_item: id, order_id, name, amount, price

如果我想获得全价 (SUM(item prices)+shipment-discount),我当然可以在我的 Order 类中添加一个方法来执行查询。另一方面,查看包含全价的订单会很方便。

是否可以将其集成到 Doctrine2 实体对象中?当我使用 Symfony/Doctrine 维护我的数据库布局时,甚至可以通过类中的注释生成这样的视图吗?

【问题讨论】:

【参考方案1】:

你有 Doctrine Entity 和 EntityRepository。

查询应该作为方法转到存储库类。 mysql-view 只是一个查询。存储库类返回一个或多个实体类。I.E 数据库表中的行。

请提供一些代码和架构,以获得更好的答案。

这可以转到订单实体:

public function getOrderTotal() 
    $sum = 0.0;
    foreach ($this->getOrderItems() as $item) 
     //Process 
    
    return $sum;

Doctrine2 不支持原生 MySQL 视图的处理和生成。

【讨论】:

对不起,“是的”什么?当我说“是否有可能将其集成到 Doctrine2 实体对象中?”我并不是要编写一个带有查询的方法,而是让 Doctrine 在数据库中生成一个视图(我也可以从外部使用)。你的回答似乎更“不”。 再说一次,我 Doctrine2 没有很奇怪的编码标准,那么我不认为 Repository 类是正确的位置。从 OOP 的角度来看,我希望从实体本身而不是从某个“存储库”中检索实体的属性。据我了解,学说 2 的优点之一是您可以使用普通对象而不是从学说类继承的类。 你误会了。您使用扩展 Doctrine Entity 的对象。优点是,例如,您没有像 mysql_fetch_assoc 这样的普通 php 数组为您提供的***工作。 我不太明白。我不为我的实体扩展任何东西。文档还说你不这样做:doctrine-project.org/docs/orm/2.1/en/tutorials/… 此外,虽然“实体”类存在,但它是最终的。【参考方案2】:

嗯 ¿ 可能吗?我不知道。我认为为这些实体做一个自定义存储库是最好的。在其方法中有查询的实体不干净。 这里有一个如何使用实体和自定义查询的示例 http://www.zalas.eu/doctrine2-and-symfony2

【讨论】:

嗨,我不认为这是正确的。 Howto 描述了查询实体实例的情况(在我的例子中,例如“getOrdersForItem($item)”)。我同意此类方法不属于实体对象。我想要做的是获得实体的自然属性,由于关系数据库的规则,它不作为列存在。在 OOM 中,这绝对是实体方法的情况。在学说1中,我认为现在的存储库被称为_Entity_Table。学说2可能有一个约定,但答案不是你的链接。

以上是关于在 Symfony 2 中使用 Doctrine 2 中的视图的主要内容,如果未能解决你的问题,请参考以下文章

Symfony 2:在 ContainerAwareCommand 中禁用 Doctrine 事件监听器

如何在 Symfony 2 / Doctrine 中启用 ENUM

在 Symfony2 中使用 Doctrine 映射异常错误

Doctrine 2,Symfony 2 中的独特约束

Symfony 2 + Doctrine 2 + PHPUnit 3.5:闭包异常的序列化

Symfony 2 Doctrine 通过 id 的有序数组查找