【问题标题】:SQL native query with ResultSetMapping object return null带有 ResultSetMapping 对象的 SQL 本机查询返回 null
【发布时间】:2017-09-15 14:22:35
【问题描述】:

我正在尝试通过 Symfony 3/Doctrine 2 应用程序使用 pdo_sqlsrv 查询 SQL Server。

我有一个 SQL 查询,我想使用 ResultSetMapping 对象将结果与我的实体绑定:

这是我的SupplierRepository.php的函数

class SupplierRepository extends EntityRepository
{
public function getSuppliers()
{
    $rsm = new ResultSetMapping;
    $rsm->addEntityResult('AppBundle\Entity\Supplier', 's');
    $rsm->addFieldResult('s', 'T_TIERS', 'code');
    $rsm->addFieldResult('s', 'T_LIBELLE', 'name');
    $rsm->addFieldResult('s', 'T_ADRESSE1', 'address1');
    $rsm->addFieldResult('s', 'T_ADRESSE2', 'address2');
    $rsm->addFieldResult('s', 'T_ADRESSE3', 'address3');
    $rsm->addFieldResult('s', 'T_CODEPOSTAL', 'zipcode');
    $rsm->addFieldResult('s', 'T_VILLE', 'city');
    $rsm->addFieldResult('s', 'T_SIRET', 'siret');

    $sql = 'SELECT  s.T_TIERS,
            s.T_LIBELLE, 
            s.T_ADRESSE1, 
            s.T_ADRESSE2, 
            s.T_ADRESSE3, 
            s.T_CODEPOSTAL, 
            s.T_VILLE, 
            s.T_SIRET 
            FROM RFFOURNISSEURS s
            WHERE (s.T_NATUREAUXI=?)
            AND
            (s.T_FERME=?)';

    $query = $this->_em->createNativeQuery($sql, $rsm);
    $query->setParameters(array(1 => 'FOU', 2 => '-'));
    
    return $query->getArrayResult();
}
}

这是我的实体 Supplier.php

/**
 * Supplier
 *
 * @ORM\Table(name="supplier")
 * @ORM\Entity(repositoryClass="AppBundle\Repository\SupplierRepository")
 */
class Supplier
{

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

/**
 * @var int
 *
 * @ORM\Column(name="code", type="string", unique=true)
 */
private $code;

/**
 * @var string
 *
 * @ORM\Column(name="name", type="string", length=255)
 */
private $name;

/**
 * @var string
 *
 * @ORM\Column(name="address1", type="string", length=255, nullable=true)
 */
private $address1;

/**
 * @var string
 *
 * @ORM\Column(name="address2", type="string", length=255, nullable=true)
 */
private $address2;

/**
 * @var string
 *
 * @ORM\Column(name="address3", type="string", length=255, nullable=true)
 */
private $address3;

/**
 * @var int
 *
 * @ORM\Column(name="zipcode", type="integer", nullable=true)
 */
private $zipcode;

/**
 * @var string
 *
 * @ORM\Column(name="city", type="string", length=255, nullable=true)
 */
private $city;

/**
 * @var int
 *
 * @ORM\Column(name="siret", type="integer", nullable=true)
 */
private $siret;

/**
 * @return int
 */
public function getCode(): int
{
    return $this->code;
}

/**
 * @param int $code
 */
public function setCode(int $code)
{
    $this->code = $code;
}

/**
 * @return string
 */
public function getName(): string
{
    return $this->name;
}

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

/**
 * @return string
 */
public function getAddress1(): string
{
    return $this->address1;
}

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

/**
 * @return string
 */
public function getAddress2(): string
{
    return $this->address2;
}

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

/**
 * @return string
 */
public function getAddress3(): string
{
    return $this->address3;
}

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

/**
 * @return int
 */
public function getZipcode(): int
{
    return $this->zipcode;
}

/**
 * @param int $zipcode
 */
public function setZipcode(int $zipcode)
{
    $this->zipcode = $zipcode;
}

/**
 * @return string
 */
public function getCity(): string
{
    return $this->city;
}

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

/**
 * @return int
 */
public function getSiret(): int
{
    return $this->siret;
}

/**
 * @param int $siret
 */
public function setSiret(int $siret)
{
    $this->siret = $siret;
}

错误/结果

查询执行得很好,我有一个正确的 1025 个元素的数组,但它们是 NULL,而不是供应商对象:

array(1025) {
    [0]=> NULL
    [1]=> NULL
    [2]=> NULL
    [3]=> NULL
    [4]=> NULL
    ...
}

有什么想法吗?是类型错误吗?在调试期间,我能够看到数据正在从数据库中提取:

【问题讨论】:

  • 请问真的需要原生查询吗?可以使用学说来完成
  • 嗨 M Khalid Junaid,感谢您的回答,我选择了本机查询选项,因为我在这里的查询更简单,我拥有的真正的查询包含一个表的连接,而且我不是很conftable 与查询生成器尚未,但我会这样做。

标签: php sql-server symfony doctrine


【解决方案1】:

Supplier 实体的字段都是私有的。将它们更改为公共应该允许 RSM 设置它们。您还应该从数据库中提取一些内容来填充id 字段。

class Supplier
{
    public $id;
    public $code;
    public $name;
    // etc.
}

【讨论】:

  • 感谢 miken32 !它通过填写我的实体的字段“id”来解决(我也将字段从私有更改为公共,但它没有解决)。
【解决方案2】:

在我的情况下,我正在我的数据库中搜索一个实体,该实体具有一个复合键作为 PK,即在该实体中存在两个具有注释 @Id 的属性。

我为什么要提到这个?因为它可能是复合键在 Doctrine 和 createNativeQuery 的上下文中带来了更多的限制。当我使用ResultSetMapping 查询数据库并使用addFieldResult 方法时,我还收到一个长度等于select 中的行数但所有属性都为null 的数组。

我的解决方案是使用

$rsm->addScalarResult( 'T_TIERS', 'code');

我从这个doctrine2/issues/6273获取信息

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-04
    • 1970-01-01
    • 1970-01-01
    • 2017-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多