TL DR:
You can use the EAGER flag for a class property so that it loads it eagerly. http://doctrine-orm.readthedocs.org/en/latest/reference/annotations-reference.html#manytoone
I'm not sure if this will help you, but I decided it.
First, a little background for my situation. I am currently creating an OAuth 2 implementation on which I want to control small grains by area. The scope is quite granular for (e.g. email, username, etc.), then you can set individual permissions for each of them for reading, creating, editing and deleting.
Here is a database diagram that shows that relationship:

So, my problem was how, for example, I see if a particular token is allowed to read (permission) username (region)?
If I download a token, then I get all its permissions, and then I ask to read it , check the scope of the username , and then a lot of access to the database.
Test code:
$permissions = $this->getOAuthHelper() ->getAccessToken($accessToken) ->getPermissions(); $results = []; foreach ($permissions as $permission) { $results[] = $permission->getScope()->getTitle(); } return $results;
Query Log:
150630 10:49:47 54 Connect root@localhost on api 150630 10:49:51 54 Query SELECT t0.id AS id1, t0.token AS token2, t0.token_expiration AS token_expiration3, t0.refresh AS refresh4, t0.created_at AS created_at5, t0.deleted_at AS deleted_at6, t0.user_id AS user_id7, t0.client_id AS client_id8 FROM oauth_access_tokens t0 WHERE t0.token = 'user-test-token' LIMIT 1 54 Query SELECT t0.id AS id1, t0.access_permission AS access_permission2, t0.scope_id AS scope_id3 FROM oauth_permissions t0 INNER JOIN oauth_access_to_permissions ON t0.id = oauth_access_to_permissions.permission_id WHERE oauth_access_to_permissions.access_id = '1' 150630 10:49:52 54 Query SELECT t0.id AS id1, t0.title AS title2, t0.brief AS brief3, t0.category_id AS category_id4 FROM oauth_scopes t0 WHERE t0.id = '1' 54 Query SELECT t0.id AS id1, t0.title AS title2, t0.brief AS brief3, t0.category_id AS category_id4 FROM oauth_scopes t0 WHERE t0.id = '2' 54 Query SELECT t0.id AS id1, t0.title AS title2, t0.brief AS brief3, t0.category_id AS category_id4 FROM oauth_scopes t0 WHERE t0.id = '3' 54 Query SELECT t0.id AS id1, t0.title AS title2, t0.brief AS brief3, t0.category_id AS category_id4 FROM oauth_scopes t0 WHERE t0.id = '4' 54 Query SELECT t0.id AS id1, t0.title AS title2, t0.brief AS brief3, t0.category_id AS category_id4 FROM oauth_scopes t0 WHERE t0.id = '5' 54 Query SELECT t0.id AS id1, t0.title AS title2, t0.brief AS brief3, t0.category_id AS category_id4 FROM oauth_scopes t0 WHERE t0.id = '6' 54 Query SELECT t0.id AS id1, t0.title AS title2, t0.brief AS brief3, t0.category_id AS category_id4 FROM oauth_scopes t0 WHERE t0.id = '7' 54 Query SELECT t0.id AS id1, t0.title AS title2, t0.brief AS brief3, t0.category_id AS category_id4 FROM oauth_scopes t0 WHERE t0.id = '8' 54 Query SELECT t0.id AS id1, t0.title AS title2, t0.brief AS brief3, t0.category_id AS category_id4 FROM oauth_scopes t0 WHERE t0.id = '9' 54 Query SELECT t0.id AS id1, t0.title AS title2, t0.brief AS brief3, t0.category_id AS category_id4 FROM oauth_scopes t0 WHERE t0.id = '10' 54 Query SELECT t0.id AS id1, t0.title AS title2, t0.brief AS brief3, t0.category_id AS category_id4 FROM oauth_scopes t0 WHERE t0.id = '11' 54 Query SELECT t0.id AS id1, t0.title AS title2, t0.brief AS brief3, t0.category_id AS category_id4 FROM oauth_scopes t0 WHERE t0.id = '12' 54 Query SELECT t0.id AS id1, t0.title AS title2, t0.brief AS brief3, t0.category_id AS category_id4 FROM oauth_scopes t0 WHERE t0.id = '13' 54 Quit
However, we can see here that the bulk of this is the collection of areas attached to permissions. We can use the fager flag in relation from permission to scope to access areas with permissions:
/** * @var Scope * * @ORM\ManyToOne(targetEntity="OAuthScope", fetch="EAGER") * @ORM\JoinColumns({ * @ORM\JoinColumn(name="scope_id", referencedColumnName="id") * }) */ protected $scope;
Note the fetch="EAGER" flag in the ManyToOne annotation.
Now, if we run the same code:
150630 11:00:06 55 Connect root@localhost on api 150630 11:00:10 55 Query SELECT t0.id AS id1, t0.token AS token2, t0.token_expiration AS token_expiration3, t0.refresh AS refresh4, t0.created_at AS created_at5, t0.deleted_at AS deleted_at6, t0.user_id AS user_id7, t0.client_id AS client_id8 FROM oauth_access_tokens t0 WHERE t0.token = 'user-test-token' LIMIT 1 150630 11:00:11 55 Query SELECT t0.id AS id1, t0.access_permission AS access_permission2, t0.scope_id AS scope_id3, t4.id AS id5, t4.title AS title6, t4.brief AS brief7, t4.category_id AS category_id8 FROM oauth_permissions t0 LEFT JOIN oauth_scopes t4 ON t0.scope_id = t4.id INNER JOIN oauth_access_to_permissions ON t0.id = oauth_access_to_permissions.permission_id WHERE oauth_access_to_permissions.access_id = '1' 55 Quit