gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 08:08:55 28 4
gpt4 key购买 nike

我使用 Doctrine 2.3.4。和Symfony 2.3.0

我有两个实体:PersonApplication

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

PersonApplication的关系是双向OneToMany

使用常规的Doctrine文档here,仅在使用单个实体时,我设法获得了正确的结果集。
但是,当我添加连接的实体时,我得到了一个根实体的集合,但是连接到一个错误的相关实体。

换句话说,问题是我得到了一组应用程序,但都具有相同的Person。

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

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

关于symfony - 如何通过使用Doctrine ResultSetMapping获取相关实体的集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22302246/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com