Gaylord.P
Gaylord.P

Reputation: 1468

Disable Doctrine automatic queries

With Symfony 4.2 and Doctrine, I want to disable automatic queries.

If I execute this simple example :

$posts = $em->getRepository(Post::class)->findAll();

foreach ($posts as $post) {
    dump($post->getCategory()->getName();
}

Doctrine will search categories by itself. But I want to disable that. to force me to join (LEFT or INNER in repository).

It's possible ? Thanks

Upvotes: 0

Views: 997

Answers (2)

b126
b126

Reputation: 1254

Nothing can automatically disable this behavior and force you to write JOIN clauses, except your wishes.

This behavior (which is called lazy loading) is one of the main common behavior of all ORMs.

If you are not happy with this (and you probably have good reasons), then consider writing your own DQL queries, which are limited to your selected fields. What is not in your query will not be fetched automatically afterwards.

Write this method in your custom PostRepository class :

public function findAll(){
    $qb = $this->getEntityManager()->createQueryBuilder();
    $qb->select('p')
        ->from('Post', 'p');
    return $qb->getQuery()->getResult();
}

Then in your controller, you can do the same as before:

$posts = $em->getRepository(Post::class)->findAll();

foreach ($posts as $post) {
    dump($post->getCategory()->getName();
}

Calling the getName() method from the Category entity will now throws an error, and will not launch any hidden SQL queries behind. If you want to play with Posts and Categories together, then you can adapt your findAll() method like this :

public function findAll(){
    $qb = $this->getEntityManager()->createQueryBuilder();
    $qb->select('p, c')
        ->from('Post', 'p');
        ->join('p.category', 'c')
    return $qb->getQuery()->getResult();
}

Upvotes: 1

Flying
Flying

Reputation: 4560

Implicit data fetching from database by accessing linked entity properties is one of core principles of Doctrine and can't be disabled. If you want to just fetch some data explicitly - you need to construct your own partial query and hydrate data either as array or simple object so your fetched results will not became entities.

Upvotes: 3

Related Questions