Search code examples
symfonyevent-handlingdoctrinelazy-loadingsonata-admin

Avoid doctrine postloadEvent if unnecessary


For an blog entry entity I am loading data from an api via the doctrine postloadEvent. For this i created a listener service with an postloadMethod in it.

public function postLoad(BlogEntry $blogEntry)
{
    $blogentry->setName($apiClient->getName($blogEntry->getId()))
    $blogentry->setContent($apiClient->getContent($blogEntry->getId()))
    ...
}

This means, there is already a local repository with blog entries. These blogentries are connected to a blog. If i now only want to count the blogentries for each blog, i would implement a getBlogEntryCount() method on the BlogEntry entity and call it.

$blog->getBlogEntryCount();

The problem now is, that the postLoad event is triggered unnecessary, even if i need no data from the api.

How can i avoid this behaviour in doctrine/symfony/sonata admin? Is there mechanism like "lazy loading" for doctrine entities?

Update to Jose M. González Solution

To get only the count of the collection, the extra_lazy loading solution will do it. For getting local information without triggering the api call i used the said repository function. To get this information working in list view in sonata admin, i created a non-doctrine-related array field "blogEntriesSimple" in my Blog Entity next to my "blogEntries" (which is normally holding the complete entity) field. I attached an entitylistener with postLoad function to the Blog Entity, which is filling up my blogEntriesSimple array with the information from my custom repository function. Thats it.

I think this solution is a bit hacky, but until no cleaner solution is available, this will do it.


Solution

  • i think that you can achieve this with the extra lazy associations that permit that you count your related entities without hydrating it

    Edited

    Also you can do a DQL query that only hidrate a partial view of your entity and it can be used to count the rows and access to your properties, for example:

    select be.id,be.title from AppBundle\Entity\BlogEntry be
    

    This query must not trigger the postLoad event

    I hope this can help you