我正在尝试在一系列销售备忘录和交易记录之间建立多对一关系。
/**
* @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如何协会?非常感谢您的帮助。
答案 0 :(得分:1)
我对您的问题的理解是您正在使用$formnoseller
和$formnobuyer
的实体字段类型(或者您没有指定类型)。选择从基础表中选择任何élément是实体字段类型的预期行为(默认情况下用于OneToMany关系)
如果您没有为这些字段选择表格中所有元素的选择列表,则应使用其他表单字段类型。您还应该查看文档中的data transformers。
答案 1 :(得分:0)
如果是我,我会写一个存储过程并根据需要进行内部或外部连接。
曾几何时,他们称这个“客户端服务器”代码。大约15年前,它创造了如此混乱的整个行业转向n层发展。我想知道表连接如何再次放回到表示层? ORM和LINQ-to-SQL是对客户端/服务器的返回“。
如果必须这样做,请在模型上的LINQ中进行连接。不要使用ORM语言。