首页 > 解决方案 > 尝试将 Doctrine 查询结果映射到 DTO 时给出错误,int

问题描述

我有这个配置:

代理实体类:

/**
 * 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();
}

这会引发以下错误。

传递给 App\DTO\AgentDTO::__construct() 的参数 1 必须是 App\Entity\Agent 的实例,int 给定

我已将其放入$arg_list = func_get_args();构造函数中,AgentDTO并且我注意到有一个参数是实体的标识符。为什么它不是一个实例Agent

标签: phpsymfonydoctrinedto

解决方案


该文件明确指出:

请注意,您只能将标量表达式传递给构造函数。

但是,还有另一种可能的方式将您的结果映射到 DTO - 通过提供自定义水合模式

在查询的末尾指定一个水合器名称:

...
->getQuery()
->getResult('AgentHydrator');

然后,在orm属性下的配置文件中指定水合器映射(Symfony文档链接):

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;
    }
}

推荐阅读