错误,尝试将 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;
    }
}