我正在尝试通过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。
答案 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');
获取信息