Jen*_*ens 13 symfony doctrine-orm
有三个实体:客户,消息,附件.
这些实体之间的关系是直截了当的:客户可以拥有许多消息,而消息可以包含许多附件.这两种关系都是"一对多".
我在加载Customer实体的消息时告诉doctrine是懒惰的.因此$customer->getMessages()产生了一个额外的SQL语句.没关系.
但我还为Message实体的附件定义了一个"EAGER"加载.
现在我希望通过调用得到的消息$customer->getMessages()已经加载了所有附件.但$message->getAttachments()仍会在每条消息中生成一条SQL语句.
这种行为有望吗?
仅供参考,我的班级除外:
Customer.php
class Customer
{
/**
* @ORM\OneToMany(targetEntity="Message", mappedBy="customer")
* @ORM\OrderBy({"createdOn" = "DESC"})
*/
private $messages;
Run Code Online (Sandbox Code Playgroud)
Message.php
class Message
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity="Customer", inversedBy="messages")
* @ORM\JoinColumn(name="customer_id", referencedColumnName="id")
**/
private $customer;
/**
* @ORM\OneToMany(targetEntity="Attachment", mappedBy="message", fetch="EAGER")
**/
private $attachments;
Run Code Online (Sandbox Code Playgroud)
Attachment.php:
class Attachment
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity="Message", inversedBy="attachments")
* @ORM\JoinColumn(name="message_id", referencedColumnName="id")
**/
private $message;
Run Code Online (Sandbox Code Playgroud)
Der*_*k F 10
这对我来说听起来像是预期的行为.该学说文档似乎意味着急切的提取只有一个层次.
根据文件:
每当您查询具有持久关联的实体并将这些关联映射为EAGER时,它们将自动与要查询的实体一起加载,因此可立即供您的应用程序使用.
http://doctrine-orm.readthedocs.org/en/latest/reference/working-with-objects.html#by-eager-loading
在您的情况下被查询的实体是客户,客户急于消息,因此填充了消息.但是,消息不是要查询的对象,因此附件不会被加载.
正确的代码示例可能如下所示:
注意:使用延迟加载获取消息,即主动获取带有附加查询的消息; 只要从数据库中获取消息,就会自动加载引用每条消息的相应附件.
class Customer
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\OneToMany(targetEntity="Message", mappedBy="customer", fetch="LAZY")
* @ORM\OrderBy({"createdOn" = "DESC"})
*/
private $messages;
Run Code Online (Sandbox Code Playgroud)
class Message
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity="Customer", inversedBy="messages")
* @ORM\JoinColumn(name="customer_id", referencedColumnName="id")
*/
private $customer;
/**
* @ORM\OneToMany(targetEntity="Attchment", mappedBy="message", fetch="EAGER")
*/
private $attachments;
Run Code Online (Sandbox Code Playgroud)
class Attachment
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\ManyToONe(targetEntity="Message", inversedBy="attachments")
* @ORM\JoinColumn(name="message_id", referencedColumnName="id")
*/
private $message;
Run Code Online (Sandbox Code Playgroud)