带有ResultSetMapping对象的sql本机查询返回null

时间:2017-09-15 14:22:36

标签: php sql-server symfony doctrine

我正在尝试通过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,而不是Supplier对象:

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

有什么想法吗?这是一个类型错误吗?在调试期间,我能够看到the data is getting pulled from the database

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

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

我的解决方案是使用

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

我正在从此doctrine2/issues/6273

获取信息