1 対多に関連付けられた2 つのドクトリン エンティティ (Person
およびCompany
) と、次のようなリポジトリが与えられます。
namespace TestBundle\Entity\Repository;
use Doctrine\ORM\EntityRepository;
class PersonRepository extends EntityRepository {
public function findAllByAge($age) {
$qb = $this->createQueryBuilder('p')
->select('p','c')
->leftjoin('p.company', 'c')
->where("p.age = :age")
->setParameter('age', $age);
// ...
}
}
できれば $qb オブジェクト (または Alias、DQL、AST、パーサーなど) から、会社のエンティティ (オブジェクトまたは名前) を取得するにはどうすればよいですか?
理想的には、Querybuilder インスタンスで使用されるすべてのエイリアス、または少なくともselectメソッドで定義されたものと、それらのエンティティを次の形式で含む配列が必要です。
[
'p' => 'TestBundle\Entity\Person',
'c' => 'TestBundle\Entity\Company',
// etc
]
$qb->getDQLPart('join')
エイリアスに関する結合情報があるような低レベルのものもありますが、ルートエンティティとその$qb->getQuery()->getAST()->fromClause->identificationVariableDeclarations
エイリアスのみが含まれています (p = TestBundle\Entity\Person)。
getRootEntity
、getRootAliases
、getAllAliases
ルートエンティティおよび/またはすべてのエイリアスを取得するため、役に立ちませんが、それらをリンクする方法はありません。
$em->getClassMetadata($rootentity)->associationMappings
ルートエンティティの関連付けが表示され、結合のターゲットエンティティが含まれていますが、エイリアスは含まれていません。もちろん、フィールド名を情報にマップすることもできますが、そうすると、各エンティティ オブジェクトから情報を再帰的$qb->getDQLPart('join')
にクロールしなければならない領域に入ります。重大なエラーを引き起こす可能性があるようです。
Querybuilder は関連付けを適切なエンティティにどのように変換しますか? それとも、それが使用しているエンティティを知らずに、下位レベルのものに解析するだけで、まったくそれを行いませんか?
特定のエンティティ フィールドに特定のセカンダリ インデックスがあることを確認できるように、情報が必要です。これらのセカンダリ インデックスは、注釈を使用して設定でき、教義 ( $em->getClassMetadata($entity)->table['indexes']
) によってエンティティに格納されます。
クエリの作成中にどのフィールドにセカンダリ インデックスがあるかを (プログラムで) 知る必要があり、抽象化ツリーのできるだけ上位にとどまることを好みます。