错误,尝试将 Doctrine 查询结果映射到 DTO 时给出的 int
Error, int given when trying to map a Doctrine query result to a DTO
我有这样的配置:
代理实体class:
/**
* Agent
*
* @ORM\Table(name="agent")
* @ORM\Entity(repositoryClass="App\Repository\AgentRepository")
*/
class Agent
{
...
代理 DTO:
class AgentDTO
{
public function __construct(Agent $agent)
{
...
代理存储库:
public function findAgentByField(string $field)
{
return $this->getEntityManager()
->createQueryBuilder()
->select('NEW App\DTO\AgentDTO(a)')
->from('App:Agent', 'a')
->where('a.field= :field')
->setParameter('field', $field)
->getQuery()->getResult();
}
这将引发以下错误。
Argument 1 passed to App\DTO\AgentDTO::__construct() must be an
instance of App\Entity\Agent, int given
我已将此 $arg_list = func_get_args();
放入 AgentDTO
的构造函数中,我注意到有一个参数是实体的标识符。为什么它不是 Agent
的实例?
文档明确指出:
Note that you can only pass scalar expressions to the constructor.
但是,还有另一种可能的方法将您的结果映射到 DTO - 通过提供自定义 hydration mode:
在查询的末尾指定水龙头名称:
...
->getQuery()
->getResult('AgentHydrator');
然后,在 orm
属性 下的配置文件中指定 hydrator 映射(Symfony docs link):
doctrine:
orm:
...
hydrators:
AgentHydrator: My\Bundle\Hydrators\Agent\AgentHydrator
最后指定自定义保湿器:
class AgentHydrator extends AbstractHydrator
{
/**
* {@inheritdoc}
*/
protected function hydrateAllData()
{
$result = [];
while ($data = $this->_stmt->fetch(\PDO::FETCH_OBJ)) {
$result[] = new AgentDTO($data);
}
return $result;
}
}
我有这样的配置:
代理实体class:
/**
* Agent
*
* @ORM\Table(name="agent")
* @ORM\Entity(repositoryClass="App\Repository\AgentRepository")
*/
class Agent
{
...
代理 DTO:
class AgentDTO
{
public function __construct(Agent $agent)
{
...
代理存储库:
public function findAgentByField(string $field)
{
return $this->getEntityManager()
->createQueryBuilder()
->select('NEW App\DTO\AgentDTO(a)')
->from('App:Agent', 'a')
->where('a.field= :field')
->setParameter('field', $field)
->getQuery()->getResult();
}
这将引发以下错误。
Argument 1 passed to App\DTO\AgentDTO::__construct() must be an instance of App\Entity\Agent, int given
我已将此 $arg_list = func_get_args();
放入 AgentDTO
的构造函数中,我注意到有一个参数是实体的标识符。为什么它不是 Agent
的实例?
文档明确指出:
Note that you can only pass scalar expressions to the constructor.
但是,还有另一种可能的方法将您的结果映射到 DTO - 通过提供自定义 hydration mode:
在查询的末尾指定水龙头名称:
...
->getQuery()
->getResult('AgentHydrator');
然后,在 orm
属性 下的配置文件中指定 hydrator 映射(Symfony docs link):
doctrine:
orm:
...
hydrators:
AgentHydrator: My\Bundle\Hydrators\Agent\AgentHydrator
最后指定自定义保湿器:
class AgentHydrator extends AbstractHydrator
{
/**
* {@inheritdoc}
*/
protected function hydrateAllData()
{
$result = [];
while ($data = $this->_stmt->fetch(\PDO::FETCH_OBJ)) {
$result[] = new AgentDTO($data);
}
return $result;
}
}