我需要有关 Symfony 5、Doctrine queryBuilder 的帮助。我需要找到一些单对多关系只包含来自选定文件组的文件的项目。
Entity structure:
Documents.php:
Id
Name: (string)
FILES: (OneToMany DocumentsFiles.php)
DocumentsFiles.php:
Id
File: (OneToOne)
FileGroup: (ManyToOne DocumentsFilesGroup.php)
Documents: (ManyToOne Documents.php)
DocumentsFilesGroup.php:
Id
Name: (string)
ShortName: (string)
Files: (OneToMany DocumentsFiles.php)
Database:
Document
ID, NAME, FILES (OneToMany)
1, SomeName, [{1, File, 1},{2, File1, 1},{3, File2, 1},{4, File3, 2}],
2, SomeName1, [{5, File4, 1},{6, File5, 1}]
3, SomeName2, [{12, File11, 2}]
4, SomeName3, [{13, File12, 1}]
5, SomeName4, [{16, File15, 2}]
DocumentsFileGroups
Id, Name, ShortName
1, Temporary, tmp
2, Final, final
For example:
I need document with temporary files only.
Result:
2, SomeName1, [{5, File4, 1},{6, File5, 1}]
4, SomeName3, [{13, File12, 1}]
In DocumentRepository i have query:
$query->addSelect('nodeFiles')->leftJoin('node.files', 'nodeFiles')->leftJoin(\App\Entity\DocumentsFiles::class, 'nodeExt', Expr\Join::WITH, 'nodeExt.fileGroup IN (:documentsFileGroup) AND nodeExt.fileGroup NOT IN (:documentsNotFileGroup)')
->setParameter('documentsFileGroup', 1)
->setParameter('documentsNotFileGroup', 2);
But in results i have:
(wrong) 1, SomeName, [{1, File, 1},{2, File1, 1},{3, File2, 1},{4, File3, 2}],
2, SomeName1, [{5, File4, 1},{6, File5, 1}]
4, SomeName3, [{13, File12, 1}]
有人有想法或线索吗? 感谢您的帮助。
答案 0 :(得分:0)
使用 innerJoin
而不是 leftJoin
DocumentsFiles oe 甚至更好地将过滤条件放入 where()
,因为您不需要加入 DocumentFiles
两次。它可能看起来像这样:
$query->addSelect('nodeFiles')
->innerJoin('node.files', 'nodeFiles')
->where($query->expr()->eq('nodeFiles.fileGroup', ':documentsFileGroup'))
->andWhere($query->expr()->neq('nodeExt.fileGroup', ':documentsNotFileGroup'))
->setParameter('documentsFileGroup', 1)
->setParameter('documentsNotFileGroup', 2);