【问题标题】:Doctrine createNativeQuery returns no results学说 createNativeQuery 不返回任何结果
【发布时间】:2014-07-22 15:02:13
【问题描述】:

tl;博士

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

详情

查询

从 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

【问题讨论】:

    标签: symfony doctrine-orm


    【解决方案1】:

    嗯,我发现了问题。这是由于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...

    【讨论】:

      【解决方案2】:

      在我的例子中没有结果,因为在 SQL 查询中我没有选择“主”实体(FROM 子句中的那个)的列“id”。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-12-28
        • 2017-12-09
        • 2020-10-03
        • 2017-03-19
        • 2017-05-20
        • 2012-08-08
        • 1970-01-01
        相关资源
        最近更新 更多