我正在使用Apigility创建一个休息应用程序,后端和前端几乎都是独立的应用程序。
好的,在后端我使用'zf-apigility-doctrine-query-provider'
创建查询,具体取决于通过url发送的参数(即localhost?instancia=10
),但我需要使用存储的MS SQL数据库处理信息功能,像这样:
function createQuery(ResourceEvent $event, $entityClass, $parameters){
/* @var $queryBuilder \Doctrine\ORM\QueryBuilder */
$queryBuilder = parent::createQuery($event,$entityClass, $parameters);
if (!empty($parameters['instancia'])) {
$queryBuilder->andWhere($queryBuilder->expr()->eq('chapa.instancia', 'dbo.isItSpecial(:instancia)'))
->setParameter('instancia', $parameters['instancia']);
}
return $queryBuilder;
}
但是它根本行不通,它不会接受'dbo.isItSpecial'
,似乎我无法访问ServiceLocator
,也无法访问EntityManager
或Querybuilder
以外的任何内容1}}。
我考虑创建一个本机查询来获取结果并在主查询中使用它,但似乎我无法创建它。
有什么想法吗?
答案 0 :(得分:0)
这个方法是什么类?为您的问题添加一些上下文。
你parent::createQuery
表明你在a DoctrineResource
instance。如果这是真的,则意味着the ServiceLocator
和the ObjectManager
都可以在班级中使用。
您可以阅读Doctrine here in the Documentation中的原生查询:
$rsm = new ResultSetMapping();
$query = $entityManager->createNativeQuery(
'SELECT id, name, discr FROM users WHERE name = ?',
$rsm
);
$query->setParameter(1, 'romanb');
$users = $query->getResult();
答案 1 :(得分:0)
原来我找到了一些方法来做到这一点。
该方法所使用的类扩展了此类
ZF \ Apigility \学说\服务器\查询\提供商\ DefaultOrm
这意味着我可以访问ObjectManager。文档没有多大帮助,但是ObjectManager实际上是一个EntityManager(ObjectManager只是界面),为了发现这个,我必须使用get_class PHP命令。
通过实体经理,我可以做到Wilt闷闷不乐的事情,就像这样:
$sqlNativa = $this->getObjectManager()->createNativeQuery("Select dbo.isItSpecial(:codInstancia) as codEleicao", $rsm);
但是,我创建了一个执行此功能的服务(它将在很多地方使用),所以我还建立了一个工厂,将这个服务设置为查询提供者类,在配置文件上它就像是此
'zf-apigility-doctrine-query-provider' => array(
'factories' => array(
'instanciaDefaultQuery' => 'Api\Instancia\instanciaQueryFactory',
),
),
工厂看起来像这样(服务正在执行NativeQuery,就像Wilt的回复一样):
use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
use Api\EleitoChapaOrgao\EleitoChapaOrgaoQuery;
class InstanciaQueryFactory implements FactoryInterface
{
public function createService(ServiceLocatorInterface $serviceManager){
$instanciaService = $serviceManager->getServiceLocator()->get('Application\Service\Instancia');
$query = new InstanciaQuery($instanciaService);
return $query;
}
}
最后,只需将构造函数添加到QueryProvider中,服务就可以在那里使用:
class InstanciaQuery extends DefaultOrm
{
protected $instanciaService;
public function __construct(Instancia $instanciaService)
{
$this->instanciaService = $instanciaService;
}
public function createQuery(ResourceEvent $event, $entityClass, $parameters)
{ /* The rest of the code goes here*/