Doctrine多对一关联不断从关联表中提取所有行

时间:2013-09-16 20:44:58

标签: php sql symfony doctrine-orm associations

我正在尝试在一系列销售备忘录和交易记录之间建立多对一关系。

/**
 * @var TransactionInterface
 *
 * @ORM\ManyToOne(targetEntity="Twb\Common\Model\Broker\TransactionInterface")
 * @ORM\JoinColumn(name="FormNoSeller", referencedColumnName="Form")
 */
private $formnoseller;

/**
 * @var TransactionInterface
 *
 * @ORM\ManyToOne(targetEntity="Twb\Common\Model\Broker\TransactionInterface")
 * @ORM\JoinColumn(name="FormNoBuyer", referencedColumnName="Form")
 */
private $formnobuyer;

目前它们分为两个不同的包('SalesBundle'和'BrokerBundle'),考虑到这一点,我使用SalesBundle中的SalesMemo实体和BrokerBundle中的Transaction实体的接口。

出于某种原因,当我在表单中引用$formnoseller$formnobuyer中的一个或两个时,我在dev.log中注意到,在选择了与$formnoseller匹配的所有Transaction行之后/或SalesMemos中的$formnobuyer字段,Doctrine尝试在Transaction表(TransactionInterface引用的实体)中SELECT 所有行。这有点问题,因为数据库中有无数行,占用了大量内存。

有没有办法让Doctrine避免选择所有带关联的行?或者我甚至理解Doctrine如何协会?非常感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

我对您的问题的理解是您正在使用$formnoseller$formnobuyer的实体字段类型(或者您没有指定类型)。选择从基础表中选择任何élément是实体字段类型的预期行为(默认情况下用于OneToMany关系)

如果您没有为这些字段选择表格中所有元素的选择列表,则应使用其他表单字段类型。您还应该查看文档中的data transformers

答案 1 :(得分:0)

如果是我,我会写一个存储过程并根据需要进行内部或外部连接。

曾几何时,他们称这个“客户端服务器”代码。大约15年前,它创造了如此混乱的整个行业转向n层发展。我想知道表连接如何再次放回到表示层? ORM和LINQ-to-SQL是对客户端/服务器的返回“。

如果必须这样做,请在模型上的LINQ中进行连接。不要使用ORM语言。