一般來說,如果你將有一個Resource
實體與$roles
屬性和正確標註(OneToMany
,ManyToMany
),那麼你的連接表(role_resource
)將沒有或不需要和AUTO_INCREMENT ID自身。
這是因爲Doctrine處理關聯信息並根據它們知道何時需要連接表。根據相同的關聯信息加入兩個實體時,Doctrine也知道要使用什麼條件。
因此,如果一個SQL查詢將通過使用2個連接子句通過第三個表連接兩個表,則只需要將DQL查詢告知關聯名稱,並且它將具有所有「連接表」&「連接條件」信息可用。
因此,一個簡單的查詢,看起來像:
SELECT
/* i assume $idRole is the name of the property
* mapped to the id_role column
*/
ro.idRole,
/* i assume $idResource is the name of the property
* mapped to the id_resource column
*/
re.idResource
FROM YourNamespace\Resource re
JOIN re.roles
具有同等的QueryBuilder語法:
$this->getEntityManager()->createQueryBuilder()
->select(array('ro.idRole', 're.idResource'))
->from('YourNamespace\Resource', 're')
->join('re.roles');
但JOIN
默認爲INNER JOIN
,所以我們希望通過重寫查詢,以解決這個問題:
SELECT ro.idRole,
re.idResource
FROM YourNamespace\Resource re
LEFT JOIN re.roles
與同等的queryBuilder語法:
$this->getEntityManager()->createQueryBuilder()
->select(array('ro.idRole', 're.idResource'))
->from('YourNamespace\Resource', 're')
->leftJoin('re.roles');
然而,如果你想的表role_resource
有它自己的AUTO_INCREMENT ID和在學說查詢訪問,然後主義需要知道關於這個數據表 - 它需要被映射到獨立的實體,你需要明確你加入資源,角色資源和角色的事實。
你用什麼註釋來映射這個模式到實體? –
那麼,到目前爲止你有什麼,爲什麼它不工作?請注意,不是在vanilla SQL中鏈接'LEFT JOIN'(它可以使有關行的推理在某些查詢中返回有趣)我傾向於選擇'LEFT JOIN(a JOIN b ON ...)ON ...' –