错误,尝试将Doctrine查询结果映射到DTO时给出的int

问题描述 投票:0回答:2

我有此配置:

代理实体类:

/**
 * 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的实例?

php symfony doctrine dto
2个回答
0
投票

请尝试以下操作:

public function findAgentByField(string $field)
{
    return $this
        ->createQueryBuilder('a')
        ->where('a.field= :field')
        ->setParameter('field', $field)
        ->getQuery()
        ->getResult();
}

0
投票

文档明确指出:

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

但是,还有另一种将结果映射到DTO的可能方法-通过提供自定义hydration mode

在查询末尾指定水龙头名称:

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

然后,在配置文件中的orm属性下,指定水化器映射(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;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.