为什么createNativeQuery不会返回包含空值的记录?

时间:2017-02-02 20:53:22

标签: php sql-server symfony orm doctrine

我有两个相同的Symfony 2.8项目。这两个项目的唯一区别是一个正在运行Doctrine ORM版本v2.4.8而另一个正在运行v2.5.5

问题

我在Symfony项目中都有以下代码。

$rsm = new ResultSetMapping();
$rsm->addEntityResult('EntityBundle:New', 'u');
$rsm->addFieldResult('u', 'newPK', 'newPK');
$rsm->addFieldResult('u', 'msg', 'msg');
$query = $em->createNativeQuery('StoredProcedureName @a= :a, @b= :b, @c= :c', $rsm);
$query->setParameter('a', 'a');
$query->setParameter('b', 'b');
$query->setParameter('c', 'c');
$result = $query->getArrayResult();
var_dump($result);

我的实体看起来像这样:

use Doctrine\ORM\Mapping as ORM;

/**
 * New
 *
 * @ORM\Table(name="dbo.New")
 * @ORM\Entity()
 */
class New
{
    /**
     * @var string
     *
     * @ORM\Column(name="newPK", type="string", length=255, unique=false)
     */
    private $newPK;
    /**
     * @var string
     *
     * @ORM\Column(name="msg", type="string", length=255, unique=false)
     */
    private $msg;
    /**
     * @return string
     */
    public function getNewPK()
    {
        return $this->newPK;
    }

    /**
     * @param string $newPK
     */
    public function setNewPK($newPK)
    {
        $this->newPK = $newPK;
    }
    /**
     * @return string
     */
    public function getMsg()
    {
        return $this->msg;
    }

    /**
     * @param string $msg
     */
    public function setMsg($msg)
    {
        $this->msg = $msg;
    }
}

在我的StoredProcedure中,我所拥有的就是:

CREATE PROCEDURE [dbo].[StoredProcedureName] 
AS
SELECT null as newPK, 'aaa' As msg
GO

此代码在版本v2.4.8上完全正常,可以完美地返回null值。但是这不适用于v2.5.5。它返回的只是一个在其中包含NULL的数组,而不是newPK AND msg值。如果我删除null并将其替换为空字符串或其他任何内容,则可行。但是出于一些神弃绝的原因,它不喜欢NULL值。我想要的只是检查是否返回null但是我似乎无法检查没有doctrine返回正确的值。

我不知道这些版本之间有什么变化吗?为了从原生查询中读取NULL值,我需要做什么?

1 个答案:

答案 0 :(得分:0)

我使用addScalarResult代替addFieldResult解决了这个问题。修改后的代码如下所示:

$rsm = new ResultSetMapping();
$rsm->addScalarResult('u', 'newPK', 'newPK');
$rsm->addScalarResult('u', 'msg', 'msg');
$query = $em->createNativeQuery('StoredProcedureName @a= :a, @b= :b, @c= :c', $rsm);
$query->setParameter('a', 'a');
$query->setParameter('b', 'b');
$query->setParameter('c', 'c');
$result = $query->getArrayResult();
var_dump($result);