Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.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
Symfony 如何使用Doctrine ResultsMapping获取相关实体的集合?_Symfony_Doctrine Orm_Doctrine - Fatal编程技术网

Symfony 如何使用Doctrine ResultsMapping获取相关实体的集合?

Symfony 如何使用Doctrine ResultsMapping获取相关实体的集合?,symfony,doctrine-orm,doctrine,Symfony,Doctrine Orm,Doctrine,我使用原则2.3.4。和Symfony 2.3.0 我有两个实体:Person和Application 当某人申请工作时,就会创建应用程序 从个人到应用程序的关系是OneToMany,双向的 使用常规的条令文档,我仅在处理单个实体时才能获得正确的结果集。 然而,当我添加连接实体时,我得到了一个根实体集合,但连接到了一个错误的相关实体 换句话说,问题是我得到了一个应用程序集合,但都有同一个人 本机sql查询在执行时直接返回正确的结果 代码如下: $sql = "SELECT a.id, a.job

我使用原则2.3.4。和Symfony 2.3.0

我有两个实体:
Person
Application

当某人申请工作时,就会创建应用程序

个人
应用程序
的关系是
OneToMany
,双向的

使用常规的条令文档,我仅在处理单个实体时才能获得正确的结果集。 然而,当我添加连接实体时,我得到了一个根实体集合,但连接到了一个错误的相关实体

换句话说,问题是我得到了一个应用程序集合,但都有同一个人

本机sql查询在执行时直接返回正确的结果

代码如下:

$sql = "SELECT a.id, a.job, p.first_name, p.last_name 
        FROM application a 
          INNER JOIN person p ON a.person_id = p.id";

    $rsm = new ResultSetMapping;

    $rsm->addEntityResult('\Company\Department\Domain\Model\Application', 'a');
    $rsm->addFieldResult('a','id','id');
    $rsm->addFieldResult('a','job','job');

    $rsm->addJoinedEntityResult('\Company\Department\Domain\Model\Person' , 'p', 'a', 'person');

    $rsm->addFieldResult('p','first_name','firstName');
    $rsm->addFieldResult('p','last_name','lastName');

    $query = $this->em->createNativeQuery($sql, $rsm);

    $result = $query->getResult();

    return $result;
以下是实体类:

namespace Company\Department\Domain\Model;


use Doctrine\ORM\Mapping as ORM;


/**
* Person
*
* @ORM\Entity
* @ORM\Table(name="person")
*/

class Person
{
/**
 * @ORM\Column(type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * @var string First name
 *
 * @ORM\Column(name="first_name",type="string",length=255)
 */
private $firstName;

/**
 * @var string Last name
 *
 * @ORM\Column(name="last_name",type="string",length=255)
 */
private $lastName;

/**
*
* @var Applications[]
* @ORM\OneToMany(targetEntity="Application", mappedBy="person")
*/
private $applications;
应用程序类别:

namespace Company\Department\Domain\Model;


use Doctrine\ORM\Mapping as ORM;



/**
* Application (Person applied for a job)
*
* @ORM\Entity
* @ORM\Table(name="application")
*/

class Application
{

/**
 * @ORM\Column(type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
 private $id;

/**
 * @var Person
 *
 * @ORM\ManyToOne(targetEntity="Person", inversedBy="applications")
 * @ORM\JoinColumn(name="person_id", referencedColumnName="id")
 */
private $person;


/**
 * @var string
 * @ORM\Column(name="job",type="string", length=100)
 */
private $job;

我一定是遗漏了什么?

找到了错误所在:

Person->id
属性也必须映射。 另外,
SELECT
子句中列的顺序必须与
addFieldResult()
语句的顺序相匹配

因此,
$sql
应该如下所示:

SELECT a.id, a.job, p.id AS personId, p.first_name, p.last_name 
FROM application a 
    INNER JOIN person p ON a.person_id=p.id
    $rsm->addJoinedEntityResult('\Company\Department\Domain\Model\Person' , 'p', 'a', 'person');
    $rsm->addFieldResult('p','personId','id');
    $rsm->addFieldResult('p','first_name','firstName');
    $rsm->addFieldResult('p','last_name','lastName');
和相关属性的映射,如下所示:

SELECT a.id, a.job, p.id AS personId, p.first_name, p.last_name 
FROM application a 
    INNER JOIN person p ON a.person_id=p.id
    $rsm->addJoinedEntityResult('\Company\Department\Domain\Model\Person' , 'p', 'a', 'person');
    $rsm->addFieldResult('p','personId','id');
    $rsm->addFieldResult('p','first_name','firstName');
    $rsm->addFieldResult('p','last_name','lastName');
因此,映射字段result column name对应于sql结果column name,第三个参数,
id
(在本例中)应该是属性的实际名称