私は QueryBuilder を使用して、州のある最大の 10 の都市を取得しています。
$query = $em->createQueryBuilder()
->select('c','s')
->from('CitiesBundle:Cities', 'c')
->innerJoin('c.state', 's','WITH', 'c.state = s')
->orderBy('c.population', 'DESC')
->setMaxResults(10)
->getQuery();
生成された SQL:
c0_.id を id0 として、c0_.name を name1 として、c0_.landarea を landarea2 として、c0_.density をdensity3 として、c0_.population を人口 4 として、s1_.id を id5 として、s1_.name を name6 として、c0_.state_id を state_id7 として選択します。 c0_ INNER JOIN states s1_ ON c0_.state_id = s1_.id AND (c0_.state_id = s1_.id) ORDER BY c0_.population DESC LIMIT 10
PHPMyAdminでそのクエリをテストすると、すべての都市に独自の州がありますが、アプリでは配列内のすべての都市が最初の都市の州と関連付けられています。
この場合、Doctrine2 の動作について説明してもらえますか?
[編集]
スキーマ:
XYZ\Bundle\CitiesBundle\Entity\Cities:
type: entity
table: cities
fields:
#fields
oneToMany:
state:
targetEntity: States
cascade: { }
mappedBy: null
inversedBy: null
joinColumns:
state_id:
referencedColumnName: id
orphanRemoval: false
lifecycleCallbacks: { }
XYZ\Bundle\CitiesBundle\Entity\States:
type: entity
table: states
fields:
id:
id: true
type: boolean
nullable: false
generator:
strategy: IDENTITY
name:
type: string
length: 50
fixed: false
nullable: false
lifecycleCallbacks: { }
別のスキーマ オプション (ManyToOne など) を試しましたが、うまくいきませんでした
PHPMyAdmin からのスクリーンショット、mazowieckie などは状態の名前です。私のアプリでは、10 都市すべてに州名 -> 名前 mazowieckie があります。
アプリの外観からのスクリーンショット:
ループで州名を出力しています: {{ city.state.name }}