Symfony 如何使用Doctrine ResultsMapping获取相关实体的集合?
我使用原则2.3.4。和Symfony 2.3.0 我有两个实体: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
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
(在本例中)应该是属性的实际名称