0

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

/**
 * @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 中注意到,在选择了与 SalesMemos 中的$formnoseller和/或$formnobuyer字段匹配的所有 Transaction 行之后,Doctrine 会尝试Transaction 表中的SELECT 所有行( TransactionInterface 引用的实体)。这有点问题,因为数据库中有无数行,占用了大量内存。

有什么方法可以让 Doctrine 避免选择所有具有关联的行?还是我什至正确理解教义如何进行关联?非常感谢您的帮助。

4

2 回答 2

1

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

如果您不想为这些字段选择表中所有元素的选择列表,则应使用其他表单字段类型。您还应该查看文档中的数据转换器

于 2013-09-17T07:00:59.920 回答
0

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

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

如果您必须这样做,请在模型上的 LINQ 中加入。不要使用 ORM 语言。

于 2013-09-16T21:05:43.177 回答