我有此配置:
代理实体类:
/**
* 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
的实例?
请尝试以下操作:
public function findAgentByField(string $field)
{
return $this
->createQueryBuilder('a')
->where('a.field= :field')
->setParameter('field', $field)
->getQuery()
->getResult();
}
文档明确指出:
请注意,您只能将标量表达式传递给构造函数。
但是,还有另一种将结果映射到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;
}
}