Hi Phil,
On 15 May 2016 at 23:16, Phil Stephenson <[email protected]> wrote:
> Thank you in advance for anyone who reads this and takes the time to
> respond!
>
> I have been reading a lot lately about Doctrine best practices, and I am
> interested in removing some lazy-loaded relationships on my models and
> using single, one-time queries in Repository classes.
>
> For example, my domain model has 2 entities: Event, and EventTicket
>
> EventTicket has a ManyToOne relationship to Event:
>
> class EventTicket {
> /**
> * @ORM\ManyToOne(targetEntity="Event")
> * @ORM\JoinColumn(name="event_id", referencedColumnName="id")
> */
> $event;
> ...
> }
>
> I would like to write a query that gets all events and also all event
> tickets for those events, such that the result looks something like:
>
> array (size=5)
> 0 =>
> array (size=6)
> 'id' => int 1
> 'name' => string 'Linux User Group Meetup' (length=23)
> 'startsAt' => string '2016-10-08 20:00:00' (length=19)
> 'endsAt' => string '2016-10-09 02:00:00' (length=19)
> 'hashtag' => string 'freegeek' (length=8)
> 'tickets' => array(
> array(
> 'id' => 1,
> 'name' => 'Ticket name',
> ...
> ),
> array(
> 'id' => 2,
> 'name' => 'Ticket 2 name',
> ...
> )
> )
> ...
> )
>
> But, *I want to avoid adding an inverse side relationship 'tickets' onto
> the Event entity* to avoid lazy loading due to and in general just to
> follow the best practice suggestions on Doctrine's docs about trying to
> avoid bi-directional relationships, etc.
>
> So, my query looks like this (sorry for the formatting):
>
> class EventRepository extends EntityRepository
> {
> public function findAll()
> {
> $qb = $this->getEntityManager()->createQueryBuilder();
> $qb->select('e', 't')
> ->from(Event::class, 'e')
> ->join(EventTicket::class, 't', Join::WITH, 't.event = e')
> ;
>
> $query = $qb->getQuery();
> Debug::dump($query->getArrayResult());
>
> ...
>
> Which returns me a result that looks like this:
>
> array (size=5)
> 0 => *// This is my Event object*
> array (size=6)
> 'id' => int 1
> 'name' => string 'Linux User Group Meetup' (length=23)
> 'startsAt' => string '2016-10-08 20:00:00' (length=19)
> 'endsAt' => string '2016-10-09 02:00:00' (length=19)
> 'hashtag' => string 'freegeek' (length=8)
> 'address' => string '1731 SE 10th Ave, Portland, OR 97214, United
> States' (length=51)
> 1 => *// This is the first EventTicket*
> array (size=9)
> 'id' => int 1
> 'name' => string 'Paid' (length=4)
> 'description' => string '' (length=0)
> 'quantity' => int 100
> 'price' => string '10.00' (length=5)
> 'startsAt' => null
> 'endsAt' => null
> 'minPerOrder' => int 1
> 'maxPerOrder' => null
> 2 => *// This is the second EventTicket*
> array (size=9)
> 'id' => int 2
> 'name' => string 'Free' (length=4)
> 'description' => string '' (length=0)
> 'quantity' => int 200
> 'price' => string '0.00' (length=4)
> 'startsAt' => null
> 'endsAt' => null
> 'minPerOrder' => int 1
> 'maxPerOrder' => null
>
> This is as expected, since Doctrine's docs suggest this is what the result
> set will look like when querying for multiple entities:
> http://doctrine-orm.readthedocs.io/en/latest/reference/dql-doctrine-query-language.html#fetching-multiple-from-entities
>
> *Is there any way that I can nest these 2 EventTicket arrays underneath
> the root Event array with a 'tickets' key using DQL?* This would make it
> much easier for me when I go to serialize this array. If this is not
> possible, I will have to figure out a way to loop through these values and
> transform the arrays so for serialization...
>
> Again, thank you in advance.
>
> --
>
I think this is the second time this has popped up in the last 7 days. This
is an inconsistency that we have to solve in Doctrine2.
As it stands, the quickest solution is to run two queries for this sort of
result, as fetch-joining is not supported for non-associations. If you want
to have hydrated results, then you will need an association here.
Marco Pivetta
http://twitter.com/Ocramius
http://ocramius.github.com/
--
You received this message because you are subscribed to the Google Groups
"doctrine-user" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/doctrine-user.
For more options, visit https://groups.google.com/d/optout.