我正在努力为OpenEMR中的报告奠定基础。 我是Symfony和Doctrine的新手 由于我正在使用Symfony组件。遵循这些教程有些困难,因为它们都假定充分利用了Symfony框架和理论支持。在我看来,我没有。我有这个方法调用ArSessionReposistory。
public function getpaidata($payer_id)
{
$row = $this->repository;
return $row->getInsurerPaid($payer_id);
}
在ArSessionReposistory内部,正在调用的方法是
public function getInsurerPaid(ArSession $payer_id)
{
$insurerPaid = $this->_em->getRepository($this->_entityName)->findBy([
"payer_id" => $payer_id
]);
return $insurerPaid;
}
错误消息是这样的:
PHP Fatal error: Uncaught TypeError: Argument 1 passed to OpenEMR\Repositories\ArSessionRepository::getInsurerPaid() must be an instance of OpenEMR\Entities\ArSession, integer given, called in C:\oerm_dev\www\dev\mindfulemr4\library\financialreports\src\FinancialSummaryByInsuranceController.php on line 72 and defined in C:\oerm_dev\www\dev\mindfulemr4\repositories\ArSessionRepository.php:26
我不理解ArSessionRepository :: getInsurerPaid()方法调用与ArSession之间的关系,在ArSession中,所有实体都与getter和setter一起列出。我希望有人可以解释“必须是实例”错误消息。
因为我现在想的是-> findBy(array)应该是ArSession中的一种方法,即使我试图使用该教义内置的findBy(array)方法。整个项目代码位于此处
https://github.com/juggernautsei/symfony_twig_doctrine_component
更新:
Nico Haase是对的,它确实很简单,与教义或Symfony无关。更改后
getInsurerPaid(ArSession $payer_id)
对此。我试图遵循别人的代码,这就是为什么我将其放置在这里。
getInsurerPaid($payer_id)
一切正常,应该正常进行。错误消失并且查询完成。在Github上查看更新的仓库。
答案 0 :(得分:3)
关于您的错误
PHP Fatal error: Uncaught TypeError: Argument 1 passed to OpenEMR\Repositories\ArSessionRepository::getInsurerPaid() must be an instance of OpenEMR\Entities\ArSession, integer given, called in C:\oerm_dev\www\dev\mindfulemr4\library\financialreports\src\FinancialSummaryByInsuranceController.php on line 72 and defined in C:\oerm_dev\www\dev\mindfulemr4\repositories\ArSessionRepository.php:26
发生此错误是因为函数getInsurerPaid()
需要一个ArSession
对象,但是当您在函数getpaidata()
中调用它时,您正在向其传递整数。
相反,您应该编辑getInsurerPaid()
函数以接受整数参数。
方法getInsurerPaid()
应该从id 返回一个ArSession
对象,因此您不必要求提供一个ArSession
对象。
关于您的存储库方法
如果要从存储库中检索一行,则应使用findOneBy()
方法,因为该方法将在创建对象时返回对象,否则将返回null
。
如果您要检索多个行并返回findBy()
个对象,则array
方法很有用。
更新的存储库方法
public function getInsurerPaid(int $payer_id)
{
return $this->_em->getRepository($this->_entityName)->findOneBy([
"payer_id" => $payer_id
]);
}
有关实体和存储库的一些说明
我不理解ArSessionRepository :: getInsurerPaid()方法调用与ArSession之间的关系,在ArSession中,所有实体都与getter和setter一起列出。
实体代表您的模型,这些类不会直接与您的数据库进行交互。
存储库是与数据库交互的类。他们负责对您的数据库执行读/写操作。
您所有的实体存储库都继承自Doctrine\ORM\EntityRepository
类,并为您提供了一些与数据库交互的方法(例如findBy()
),因此您无需在每次创建实体时都进行重写