Apigility + Doctrine2 QueryProvider - 无法在查询构建器

时间:2015-10-15 19:40:00

标签: php doctrine-orm zend-framework2 apigility

我正在使用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,也无法访问EntityManagerQuerybuilder以外的任何内容1}}。

我考虑创建一个本机查询来获取结果并在主查询中使用它,但似乎我无法创建它。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

这个方法是什么类?为您的问题添加一些上下文。

parent::createQuery表明你在a DoctrineResource instance。如果这是真的,则意味着the ServiceLocatorthe 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*/