Eager loading of related entity in Symfony 2

前端 未结 2 1033
[愿得一人]
[愿得一人] 2021-01-04 04:06

There are three entities: Customer, Messages, Attachments.

The relationship between these entities is straight forward: A customer can have many messages and a messa

相关标签:
2条回答
  • 2021-01-04 04:27

    It sounds like expected behavior to me. The doctrine documentation seems to imply that eager fetching is only one level deep.

    According to the docs:

    Whenever you query for an entity that has persistent associations and these associations are mapped as EAGER, they will automatically be loaded together with the entity being queried and is thus immediately available to your application.

    http://doctrine-orm.readthedocs.org/en/latest/reference/working-with-objects.html#by-eager-loading

    The entity being queried in your case is customer and customer has eager on messages so messages are populated. Messages, however are not the object being queried, so attachments do not get loaded.

    0 讨论(0)
  • 2021-01-04 04:32

    the correct code example might be like the following:

    NOTE: fetch message with lazy loading, i.e. get messages with additional query proactively; as long as the messages are fetched from database, the corresponding attachments referenced to each message will be loaded automatically.

    Customer

    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;
    

    Message

    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;
    

    Attachment

    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;
    
    0 讨论(0)
提交回复
热议问题