Php Doctrine2在可选联接上的位置
这失败了Php Doctrine2在可选联接上的位置,php,symfony,join,doctrine-orm,where,Php,Symfony,Join,Doctrine Orm,Where,这失败了 $builder = $repo->createQueryBuilder("ub") ->where("ub.badge = :badge AND ub.user = :user AND ub.project = :project") ->setMaxResults(1) ->setParameter("project", $project) ->setParameter("user", $user) ->se
$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);
项目
可能存在也可能不存在,并导致此错误
只有具有标识符的实体才允许将实体绑定到查询参数
如果查询更改为以下内容,它仍然会失败,这表明它是项目而不是任何其他实体。即使ub
(UserBadge)表中没有行,此操作仍然失败
如何更改此查询以使用WHERE语句中的项目
用户徽章YML
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)存储的,您可以直接通过引用(id)进行查询,但不能通过对象本身进行查询,因为在查询时sql不知道其他实体的表。只有在手动加入关系对象后,才能对其进行比较
请在此阅读第5节:项目实体是否有标识符?(例如,带有@id注释的成员)我相信是这样,请参见edit which no包含关于项目实体的YMLWhat-它是否定义了id?请参见new edit,yes,它有一个id和对UserBadges实体的引用您省略了有用的位-so
Acme\NameBundle\entity\UserBadges.fields.id=true
此错误<代码>[Semantic Error]第0行,第141列靠近“p)=:projec”:错误:无效的PathExpression。必须是SingleValuedAssociationField。这已经起作用了!但是为什么呢?你能解释一下为什么我的代码最初不起作用吗?哦,等等,不,我没看到,它和初始版本一起工作。我应该修改这个版本吗?我真的不明白为什么它适用于徽章和用户,但不适用于项目。。
$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());