dna*_*irl 3 symfony doctrine-orm
我有一个工作的SQL查询,它返回SQL命令行中的行,但不是通过Doctrine提交时.我认为问题在于我如何设置ResultSetMapper
.我已经阅读了有关本机查询的文档但我必须遗漏一些东西.它是什么?
从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';
Run Code Online (Sandbox Code Playgroud)
'20', 1, NULL, 'just because', '2014-07-18 10:49:00', NULL
Run Code Online (Sandbox Code Playgroud)
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();
}
Run Code Online (Sandbox Code Playgroud)
该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.
Run Code Online (Sandbox Code Playgroud)
好吧,我发现了问题.它是由于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...
归档时间: |
|
查看次数: |
12250 次 |
最近记录: |