2016-12-21 1 views
0

Так что я UserRepository, содержащий следующий кодSymfony Доктрина конструктор запросов, как не работает в PostgreSQL

namespace AppBundle\Repository; 
use \Doctrine\ORM\EntityRepository; 
class UserRepository extends EntityRepository 
{ 
    public function findByRole($role) 
    { 
     $qb = $this->_em->createQueryBuilder(); 
     $qb->select('u') 
      ->from($this->_entityName, 'u') 
      ->where('u.roles LIKE :roles') 
      ->setParameter('roles', '%"'.$role.'"%'); 

     return $qb->getQuery()->getResult(); 
    } 
} 

Это, кажется, работает прекрасно, если моя база данных MySQL, но если я изменить базу данных для PostgreSQL это запрос бросает следующую ошибку

An exception occurred while executing 'SELECT p0_.id AS id_0, p0_.username AS username_1, p0_.password AS password_2, p0_.is_active AS is_active_3, p0_.roles AS roles_4, p0_.name AS name_5, p0_.street AS street_6, p0_.city AS city_7, p0_.state AS state_8, p0_.zip_code AS zip_code_9, p0_.phone_number AS phone_number_10, p0_.dob AS dob_11, p0_.company_name AS company_name_12, p0_.company_slug AS company_slug_13, p0_.company_logo AS company_logo_14, p0_.company_details AS company_details_15, p0_.stripe_customer_id AS stripe_customer_id_16, p0_.created_at AS created_at_17, p0_.updated_at AS updated_at_18 FROM px_user p0_ WHERE p0_.roles LIKE ?' with params ["%\"ROLE_EMPLOYER\"%"]:

SQLSTATE[42883]: Undefined function: 7 ERROR: operator does not exist: json ~~ unknown LINE 1: ...at AS updated_at_18 FROM px_user p0_ WHERE p0_.roles LIKE $1^HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.

Это первый раз, когда я работаю с PostgreSQL, так что я не получаю то, что проблема есть. Поиграв с ним некоторое время, если я сгенерировал сгенерированный запрос, добавив следующий фрагмент

WHERE 
    p0_.roles::text LIKE '%ROLE_EMPLOYER%' 

Все работает нормально. Обратите внимание на :: текст.

Итак, как я могу добавить это в конструктор запросов , так что он также работает с PostgreSQL.

+0

использования -> setParameter ('роли', "%". $ роль. '%"'); –

+0

@JasminMistry Я тоже пробовал, но такая же ошибка появляется. – Baig

+0

'-> где ('CAST (u.roles AS TEXT) LIKE: role')' должен работать.Ваши «роли» - это столбец с 'json', и они не могут использоваться вместо строковых типов напрямую (где движок ожидает тип строки (f.ex.' text') - оператор 'LIKE' (также' ~~ ') так же). – pozs

ответ

0

Я решил проблему, используя JsonbBundle.

Следующие шаги я принял это исправить

$ composer require "boldtrn/jsonb-bundle 

Обновленный config.yml, добавив следующее в соответствующем месте.

doctrine: 
    dbal: 
     types: 
      jsonb: Boldtrn\JsonbBundle\Types\JsonbArrayType 
     mapping_types: 
      jsonb: jsonb 
    orm: 
     dql: 
      string_functions: 
       JSONB_AG: Boldtrn\JsonbBundle\Query\JsonbAtGreater 
       JSONB_HGG: Boldtrn\JsonbBundle\Query\JsonbHashGreaterGreater 
       JSONB_EX: Boldtrn\JsonbBundle\Query\JsonbExistence 

Изменена roles свойство типа jsonb

И внутри хранилища следующий запрос работал

$query = $this->getEntityManager()->createQuery("SELECT u FROM AppBundle:User u WHERE JSONB_HGG(u.roles , '{}') LIKE '%EMPLOYER%' "); 
$users = $query->getResult(); 
return $users; 

Заслуга Doctrine query postgres json (contains) json_array

0
public function findByRole($role) 
{ 
    $qb = $this->getEntityManager()->createQueryBuilder(); 
    $qb->select('u') 
     ->from($this->getEntityName(), 'u') 
     ->where($qb->expr()->like('u.roles', ':roles') 
     ->setParameter('roles', $qb->expr()->literal('%'.$role.'%')); 

    return $qb->getQuery()->getResult(); 
} 

Заменил вашу настраиваемую строку DQL на синтаксис QueryBuilder.

Я не знаю, может ли это быть связано с синтаксисом, который у вас есть в вашем заявлении: '%".$var."%', что может привести к его ошибке. Надеюсь, это поможет вам решить эту проблему.

Doctrine Querybuilder documentation like :

// Example - $qb->expr()->like('u.firstname', $qb->expr()->literal('Gui%')) 
public function like($x, $y); // Returns Expr\Comparison instance 
+0

Спасибо за то, что посмотрели, но это не сработает, дает мне ту же ошибку. Хотя запрос, с которым мы с вами работаем, работает с базой данных MySQL, но я работаю над PostgreSQL, и это не удается. – Baig

+0

Хорошо, хорошо, слишком плохо, удачи в поиске решения. Если вы его нашли, я бы хотел (а) принять (принять) ответ. – Kwido

+1

Я в конечном итоге исправил проблему, см. Мой ответ. – Baig

0

Вы можете создать свою функцию Как это

PS: Im, работающих на PostgreSQL Тоо

public function findByRole($role) { 
    $qb = $this->getEntityManager()->createQueryBuilder(); 
    $qb->select('u') 
      ->from($this->getEntityName(), 'u') 
      ->where("u.roles LIKE '%$role%'") 
    ; 

    return $qb->getQuery()->getResult(); 
} 
+0

Что вы пытаетесь решить? пожалуйста, уточните – Baig

+0

Ok Что его тип поля в ORM –

+0

это json_array – Baig

0

Похоже, от PostgreSQL documentation on LIKE, что вам может понадобиться, чтобы сделать это:

$qb = $this->_em->createQueryBuilder(); 
$qb->select('u') 
    ->from($this->_entityName, 'u') 
    ->where('u.roles LIKE :roles') 
    ->setParameter('roles', '\'%'.$role.'%\''); 

return $qb->getQuery()->getResult(); 

По существу, одинарные кавычки за пределами знака процента, убегая от них. Я не уверен, что это сработает, но можете ли вы попробовать?

+0

Спасибо, но это тоже не работает. бросает ту же ошибку – Baig

 Смежные вопросы

  • Нет связанных вопросов^_^