gpt4 book ai didi

symfony - 教义 createNativeQuery 不返回结果

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

tl;博士

我有一个有效的 SQL 查询,它从 SQL 命令行返回行,但通过 Doctrine 提交时则不会。我认为问题在于我如何设置ResultSetMapper。我读过docs关于 native 查询,但我一定错过了一些东西。它是什么?

详细信息

查询

从 SQL 命令行运行以下查询会生成 1 行:

SELECT t.*
FROM
StateLogItem s NATURAL JOIN (
SELECT
task_id,
MAX(
COALESCE(updatedAt, createdAt)
) d,
MAX(id) id
FROM
StateLogItem
WHERE
dtype = 'transitionlogitem'
GROUP BY
task_id
) m
RIGHT JOIN Task t ON t.id = s.task_id
WHERE s.toState = 'started';

结果:

'20', 1, NULL, 'just because', '2014-07-18 10:49:00', NULL

使用ResultSetMapping

当我尝试通过 Symfony EntityRepository 中的 Doctrine 运行相同的查询时(如下所示),即使 Symfony 探查器指示正确的查询已成功运行,我也得到零行。

public function findByActionStatus($status){
$sql = "SELECT t.id, t.description, t.created_by, t.updated_by, t.createdAt, t.updatedAt
FROM StateLogItem s
NATURAL JOIN (
SELECT task_id, MAX(COALESCE(updatedAt,createdAt)) d, MAX(id) id
FROM StateLogItem
WHERE dtype = 'transitionlogitem'
GROUP BY task_id
) m
RIGHT JOIN Task t ON t.id=s.task_id
WHERE s.toState = :status";

$em = $this->getEntityManager();

$rsm = new ResultSetMapping();
$rsm->addEntityResult('ACCQueueBundle:Task', 't');
$rsm->addFieldResult('t','t.id','id');
$rsm->addFieldResult('t','t.created_by','createdBy');
$rsm->addFieldResult('t','t.updated_by','updatedBy');
$rsm->addFieldResult('t','t.description','description');
$rsm->addFieldResult('t','t.createdAt','createdAt');
$rsm->addFieldResult('t','t.updatedAt','updatedAt');

$rsm->addJoinedEntityResult('ACCQueueBundle:TransitionLogItem','s','t','transitions'); //tried with and without


$query = $em->createNativeQuery($sql,$rsm);
$query->setParameter('status', $status);

return $query->getResult();

}

实体

Task 实体如下所示:

namespace ACC\QueueBundle\Entity;

use Doctrine\ORM\Mapping as ORM;


use Symfony\Component\Validator\Constraints as Assert;
use Doctrine\Common\Collections\ArrayCollection;
use ACC\Traits\BlameableTrait;
use ACC\MainBundle\Entity\Traits\HasDocumentsTrait;
use Gedmo\Mapping\Annotation as Gedmo;
use Gedmo\Timestampable\Traits\TimestampableEntity;


/**
* Task
* @ORM\Entity(repositoryClass="ACC\QueueBundle\Entity\TaskRepository")
* @ORM\HasLifecycleCallbacks()
*
*/
class Task {

use HasDocumentsTrait;
use BlameableTrait;
use TimestampableEntity;

/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;


/**
* @var Transition
*
* @ORM\OneToMany(targetEntity = "TransitionLogItem", mappedBy = "task", orphanRemoval = true, cascade = {"persist"})
* @ORM\OrderBy({"createdAt" = "ASC"})
*/
protected $transitions;

/**
* @var Pause
*
* @ORM\OneToMany(targetEntity = "PauseLogItem", mappedBy = "task", orphanRemoval = true, cascade = {"persist"})
* @ORM\OrderBy({"createdAt" = "ASC"})
*/
protected $pauses;


/**
* @var string
*
* @ORM\Column(name="description", type="text")
*/
protected $description;

/**
* @ORM\ManyToMany(targetEntity = "ACC\MainBundle\Entity\Document", cascade={"persist","remove"})
* @ORM\JoinTable(name="Task_Document",
* joinColumns={@ORM\JoinColumn(name="task_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="document_id", referencedColumnName="id", unique=true)})
*/
protected $documents;

//etc.

规范:

  • PHP 5.5.14
  • 学说 ORM 2.4.4
  • Symfony 2.5.2
  • symfony 环境:开发
  • 5.5.34-MariaDB-log

最佳答案

好吧,我发现了问题。这是由于 ResultSetMapping 不理解我给它的查询字段名称引起的,因为我包含了表前缀。所以我可以不包含表前缀,

即将 $rsm->addFieldResult('t','t.id','id'); 更改为 $rsm->addFieldResult('t','id','id' );

或者我可以为所有字段添加别名:

即将 SELECT t.id, t.description... 更改为 SELECT t.id AS t_id, t.description AS t_description...

关于symfony - 教义 createNativeQuery 不返回结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24890930/

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