I’m trying to do an association of 5 objects with Doctrine2 (PHP).
I’m using PostgreSQL.
Here is the Database schema:
Database schema
A company may have many Hubs, each Hub have one Harbor.
A company may have many Line, each Line have a Linelist.
A Linelist have 2 Harbors.
For example, a Linelist is “Los Angeles-Seattle”, and multiple companies may own it thanks to the Line table.
I’m trying to query all the Hub, Harbor, Linelist, and Line for one company.
I have the SQL query:
SELECT *
FROM hub h
JOIN harbor a
ON a.id = h.harbor_id
JOIN linelist l
ON (l.harborstart_id = a.id OR l.harborend_id = a.id)
JOIN line m
ON m.linelist_id = l.id
WHERE h.company_id = 41
AND m.company_id = 41"
I’m trying to do the same using DQL.
I tried this, but it doesn’t worked:
$query = $this->getEntityManager()
->createQuery('SELECT h, a, l, m
FROM AmGameBundle:Hub h
JOIN h.harbor a
JOIN a.linelist l
JOIN l.line m
WHERE h.company = :company_id
AND m.company = :company_id')
->setParameter('company_id', $company_id);
As a result, I only have the LineList and Line objects matching harborstart_id, but I want the one matching either harborstart_id or harborend_id.
Do you think this is possible in DQL?
It might be better to change the relation between Harbor and Linelist for a many to many?
I think that’s a matter of defining 2 relations from harbor to linelist in your Entities. I imagine you have something like
That will let you join Harbors to LineLists via harborstart_id (you named the variable linelist, but I think now it’s better to change the identifiers as there will be 2 referring to the same foreign table), then if you want to harborend_id
Now you can change the DQL to:
That should get you in the right direction. If it becomes troublesome though, a many-to-many approach as you speculated should be a well documented solution.