Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Doctrine2在可选联接上的位置_Php_Symfony_Join_Doctrine Orm_Where - Fatal编程技术网

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());