php - OneToMany 关系中的 Doctrine2 查询错误

标签 php mysql doctrine-orm

我遇到了 MySQL 数据库的 doctrine2 问题:

我有一个模型User 和一个模型Documents。每个 User 可能有 0 或 n 个 Documents。每个 Document 都分配给一个 User。我的模型:

用户

<?php

namespace Entity;

/**
* @Entity(repositoryClass="Entity\Repository\UserRepository")
* @Table(name="user")
*/
class User extends Object
{
    /**
    * @Id @GeneratedValue(strategy="UUID")
    * @Column(type="string", length=36)
    * @var string
    */
    protected $id;

    /**
    * @OneToMany(targetEntity="\Entity\Document", mappedBy="user")
    */
    private $documents;

    public function __construct($options = array())
    {
        $this->documents = new \Doctrine\Common\Collections\ArrayCollection;
    }
}

文档

<?php

namespace Entity;

/**
* @Entity(repositoryClass="Entity\Repository\DocumentRepository")
* @Table(name="document")
*/
class Document extends Object
{
    /**
    * @Id @Column(type="string")
    * @var string
    */
    protected $id;

    /**
    * @ManyToOne(targetEntity="\Entity\User", inversedBy="documents")
    * @JoinColumn(name="user_id", referencedColumnName="id")
    * @var User
    */
    private $user;
}

现在我想获取给定 Document ID 的 User。 SQL 查询将是:

SELECT u.*
FROM `user` u
INNER JOIN `document` d ON d.user_id = u.id
WHERE d.id = 'mydocumentid'

但这不起作用:

$user = $queryBuilder
        ->select('u.*')
        ->from('\\Entity\\User', 'u')
        ->innerJoin('\\Entity\\Document', 'd', \Doctrine\ORM\Query\Expr\Join::ON, 'd.user_id = u.id')
        ->where('d.id = :documentId')
        ->setParameter('documentId', 'mydocumentid')
        ->setMaxResults(1)
        ->getQuery()
        ->getSingleResult();

直接查询也不起作用:

$query = $em->createQuery('
    SELECT
        u.*
    FROM
        Entity\\User u
    INNER JOIN
        Entity\\Document d ON d.user_id = u.id
    WHERE
        d.id = "mydocumentid"
');

你能帮我运行一下吗?

错误信息

[Semantical Error] line 0, col 66 near 'd ON d.user_id': Error: Identification Variable \Entity\Document used in join path expression but was not defined before.

最佳答案

而不是使用:

->innerJoin('\\Entity\\Document', 'd', \Doctrine\ORM\Query\Expr\Join::ON, 'd.user_id = u.id')

尝试使用这个:

->innerJoin('u.documents', 'd', \Doctrine\ORM\Query\Expr\Join::ON, 'd.user_id = u.id')

这是因为 Doctrine 需要知道 user 中的哪个字段必须加入 documents。知道领域 Doctrine 将获取目标实体,这样 Doctine 就可以直接知道类。

关于php - OneToMany 关系中的 Doctrine2 查询错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13229753/

相关文章:

php - 改进显示 max_user_connections 的站点

PHP session 开始 "Cannot send session cookie and cache limiter"

php - Mysql SELECT函数在字段列表中返回未知列错误

php - 学说查询生成器 : how to do a query with inner joins conditions

php - 用于智能搜索的 Tricky SQL

Mysql查询选择非成员(member)

mysql - 使用 DataMapper 创建 MySQL 触发器

MySql - 在不使用聚合函数的情况下查找恰好出现两次的值

php - 添加集合/实体会使表单渲染非常慢

php - Doctrine 2 - 持久实体与连接表的外键反对外国实体