これは失敗します
$builder = $repo->createQueryBuilder("ub")
->where("ub.badge = :badge AND ub.user = :user AND ub.project = :project")
->setMaxResults(1)
->setParameter("project", $project)
->setParameter("user", $user)
->setParameter("badge", $badge);
project
このエラーまたはあってもなくてもよい存在と結果
エンティティをクエリパラメータにバインドすることは、識別子を持つエンティティにのみ許可されます
クエリを次のように変更しても失敗し、他のエンティティではなくプロジェクトを提案します。ub
(UserBadge)テーブルに行がない場合でも、これは失敗します。
$builder = $userBadgesRepo->createQueryBuilder("ub")
->where("ub.project = :project")
->setMaxResults(1)
->setParameter("project", $project);
project
WHEREステートメントで動作するようにこのクエリを変更するにはどうすればよいですか?
YML UserBadge
Acme\NameBundle\Entity\UserBadges:
type: entity
table: user_badges
repositoryClass: Acme\NameBundle\Entity\UserBadgesRepository
fields:
id:
type: integer
id: true
generator:
strategy: AUTO
added:
type: datetime
manyToOne:
badge:
targetEntity: Acme\NameBundle\Entity\Badge
inversedBy: badge_users
joinColumn:
onDelete: CASCADE
name: badge_id
referencedColumnName: id
user:
targetEntity: Acme\NameBundle\Entity\User
inversedBy: user_badges
joinColumn:
onDelete: CASCADE
name: user_id
referencedColumnName: id
project:
targetEntity: Acme\NameBundle\Entity\Project
inversedBy: project_badges
joinColumn:
onDelete: CASCADE
name: project_id
referencedColumnName: id
nullable: true
YMLプロジェクト
Acme\NameBundle\Entity\Project:
type: entity
table: project
repositoryClass: Acme\NameBundle\Entity\ProjectRepository
fields:
id:
type: integer
id: true
generator:
strategy: AUTO
**SNIP**
oneToMany:
project_badges:
targetEntity: Acme\NameBundle\Entity\UserBadges
mappedBy: project
これは機能するはずです:
$builder = $repo->createQueryBuilder("ub")
->leftJoin('ub.project', 'p')
->join('ub.badge', 'b')
->join('ub.user', 'u')
->where("b.id = :badge AND u.id = :user AND p.id = :project")
->setMaxResults(1)
->setParameter("project", $project->getId())
->setParameter("user", $user->getId())
->setParameter("badge", $badge->getId());
説明(コメントから抜粋):
関係は参照(id)によって格納され、それらによって直接クエリを実行できますが、クエリの時点でsqlは他のエンティティのテーブルを認識していないため、オブジェクト自体はクエリできません。リレーションシップオブジェクトは、手動で結合した後でのみ比較できます。
こちらのセクション5もお読みください:http://labs.octivi.com/mastering-symfony2-performance-doctrine
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加