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

11

我使用的是Doctrine 2.3.4和Symfony 2.3.0。

我有两个实体:PersonApplication

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

PersonApplication的关系是OneToMany,双向的。

使用常规的Doctrine文档这里,我只能在处理单个实体时获得正确的结果集。但是,当我添加关联实体时,我会得到一组根实体,但是它们与错误的相关实体相连。

换句话说,问题是我获得了一组应用程序,但所有应用程序都属于同一个人。

直接执行本机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;

我可能漏掉了什么?
1个回答

9

找到了错误所在:

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

因此,映射字段结果列名对应于 SQL 结果列名,而第三个参数,在这种情况下是“ id”,应该是属性的实际名称。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接