php - 尝试将 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
?
解决方案
该文件明确指出:
请注意,您只能将标量表达式传递给构造函数。
但是,还有另一种可能的方式将您的结果映射到 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;
}
}
推荐阅读
- java - JPA: Unable to resolve explicitly named mapping-file in JavaSE
- python - 在 PyQ 中使用希望打开连接句柄并更新 kdb 表
- c# - WPF C# HTMLDocument 变量自动更新
- java - Jsoup 提取跨度类中没有的内容
- c# - 为什么添加 Todo 时我的 TodoList 的 Todos 字段没有填写?
- c# - CefSharp Winforms - 在显示浏览器之前执行 javascript
- angular - Angular 6 输入单选检查值在编辑表单中不起作用?
- c# - 按钮控件样式模板和 BackgroundSizing 属性
- python - 数据库中的外键
- statistics - 用于 T 检验的对照组/测试组的最佳样本量