2011-07-04 40 views
11

Theo tiêu đề, làm cách nào để khớp với một biểu thức chính quy với trình tạo truy vấn Doctrine 2? Về cơ bản tôi đang cố gắng để tạo ra sên độc đáo.Regex với trình tạo truy vấn Doctrine 2?

Đây là triển khai hiện tại của tôi. Tôi tạo ra con sên. Sau đó tôi kiểm tra xem có bất kỳ sên nào được sử dụng như cái sên này không. Nếu có, tôi sẽ nối thêm một - {number} vào cuối slug nơi {number} là số thấp nhất chưa được sử dụng.

$qb->select(array('partial o.{id, slug}')) 
    ->from('Foo\Bar\Entity\Object', 'o') 
    ->where($qb->expr()->like('o.slug', ':slug')); 

$slug = new SlugNormalizer($text); 
$qb->setParameter('slug', $slug->__toString().'-%'); 

Vấn đề ở đây là LIKE slug% có thể khớp với foo-bar-1, foo-bar-2 và foo-bar-not-the-slug. Những gì sẽ được sạch hơn là một regex tìm kiếm REGEX slug - (\ d +) hoặc một cái gì đó tương tự.

Bất kỳ cách nào để thực hiện việc này với trình tạo truy vấn Doctrine 2?

Trả lời

-2

Không thử nghiệm (đối với MySQL):

$qb->where(new Doctrine\ORM\Query\Expr\Comparison(
    'o.slug', 'REGEXP', ':slug') 
); 
$qb->setParameter('slug', '^'.$slug->__toString().'-[[:digit:]]+$'); 
+0

này không hoạt động. Lớp Doctrine \ ORM \ Query \ Expr \ Compar chỉ có các toán tử sau: const EQ = '='; const NEQ = '<>'; const LT = '<'; const LTE = '<='; const GT = '>'; const GTE = '> ='; Không có tùy chọn NO REGEXP! Cộng với nó không phải là một hoạt động so sánh ... tại sao nó lại sống ở vị trí số 1? –

+0

Bạn nói đúng, nó không hoạt động. Nhưng đó là một hoạt động so sánh. Hai toán hạng, một toán tử giữa chúng, đối với tôi nó là so sánh. – Maxence

+0

Ah, khi bạn tuyên bố nó như thế, có thể bạn đã đúng. Có thể là một op so sánh .. bất kể, heh, nó không hoạt động. = [ –

3

REGEXP là một chức năng cụ thể nhà cung cấp để thuyết tự nó không hỗ trợ nó. Cộng với nó không phải là một chức năng nhiều như một toán tử so sánh (see this answer). Nhưng bạn có thể sử dụng hàm trên trường để so sánh với một giá trị khác. DoctrineExtensions (được viết bởi người đóng góp cho giáo lý) có mã để cho phép biểu thức chính quy trong MySQL.

Ví dụ từ File:

$query = $this->getEntityManager()->createQuery('SELECT A FROM Entity A WHERE REGEXP(A.stringField, :regexp) = 1'); 
$query->setParameter('regexp', '^[ABC]'); 
$results = $query->getArrayResult(); 

Nếu bạn không muốn sử dụng DoctrineExtensions, bạn có thể viết riêng của bạn bằng cách làm theo this blog post, hoặc bạn có thể look at the code for this Doctrine extension và viết chức năng tùy chỉnh DQL của riêng bạn.

Tôi đã xác nhận rằng REGEXP sử dụng DoctrineExtensions hoạt động tốt cho nhu cầu của tôi!

16

thêm DoctrineExtensionsBundle đầu - Cập nhật composer.json của bạn:

"beberlei/DoctrineExtensions": "0.3.x-dev", 

thêm cấu hình REGEXP - cập nhật ứng dụng của bạn/config.yml

doctrine: 
    orm: 
     dql: 
      string_functions: 
       regexp: DoctrineExtensions\Query\Mysql\Regexp 

nơi từng QueryBuilder của bạn là làm điều này:

$qb = $this->createQueryBuilder('x'); 

return $qb->andWhere('REGEXP(x.your_property, :regexp) = true') 
      ->setParameter('regexp', '[[:digit:]]{3}') // insert your own regex here 
      ->getQuery()->getResult(); 

và đừng quên sử dụng các regex tương thích SQL

+1

Sẽ tốt nếu chỉ một tham chiếu. https: // github.com/beberlei/DoctrineExtensions – thexpand

+0

Điều này cũng hoạt động khi tham gia các bảng – dustfeather

0

tôi đã làm như thế này

$query->andWhere('REGEXP(r.status, :text) = 1') 
     ->orWhere('REGEXP(r.comment, :text) = 1') 
     ->setParameter('text',MY REGULAR EXP); 
Các vấn đề liên quan