2013-04-15 27 views
7

Sau nhiều lần thử, tôi nghĩ cuối cùng tôi đã biết tài liệu bằng trái tim. Sau đó, tôi cần sự giúp đỡ của bạn .. Tôi không hiểu tại sao học thuyết chỉ cho tôi lỗi này:Doctrine setParameter và số tham số không hợp lệ

số tham số không hợp lệ: số biến ràng buộc không phù hợp số thẻ

Đây là mã của tôi:

$qb = $this->em->createQueryBuilder(); 
$qb->select('m') 
    ->from('Entities\Marque', 'm') 
    ->leftJoin('m.magasin', 'ma') 
    ->where('m.nom = :marque AND ma.nom LIKE :magasin') 
    ->setParameter('marque', $marque) 
    ->setParameter('magasin', '%'.$matchesNumber[1].'%'); 
$results = $qb->getQuery()->getArrayResult(); 

Cảm ơn trước cho câu trả lời của bạn.

+6

Bạn có thể gọi $ db-> ở điểm sau này không? Điều này sẽ ghi đè lên hiện tại nơi-tuyên bố. – sroes

+0

Không, đó là cách duy nhất sử dụng câu lệnh. –

+0

Có '$ marque' và' $ matchesNumber [1] 'không null? – cheesemacfly

Trả lời

7

Tôi rất xin lỗi .. Tôi vừa tìm thấy lỗi của mình .. Sau này, như sau này trong mã của tôi .. Tôi nhập một truy vấn mới với "$ qb" cũ của tôi .. Tôi thực sự là một noob!

+0

@sroes là ngay sau đó :) – Ejaz

+0

Chính xác! Anh ấy đúng ^^ –

8

Tôi đoán -> setParameter ghi đè trước đó.

Đối với nhiều thông số sử dụng:

->setParameters(['key1' => $value1, 'key2' => $value2]) 

Xem thuyết Nâng cấp:

Từ giờ trở đi, các thông số trong các truy vấn là một ArrayCollection thay vì một mảng đơn giản. Điều này ảnh hưởng lớn đến việc sử dụng setParameters(), bởi vì nó sẽ không thêm các tham số nữa> vào truy vấn, nhưng thực sự sẽ ghi đè lên các tham số đã định nghĩa. Bất cứ khi nào bạn đang lấy a> tham số (ví dụ. $ Query-> getParameter (1))

Doctrine Upgrade Description

Có lẽ đó cũng áp dụng cho setParameter?

+0

Tôi đã thử '-> setParameters (['marque' => $ marque, 'magasin' => '%'. $ MatchesNumber [1]. '%']);' Nhưng không thay đổi .. –

4
$qb = $this->em->createQueryBuilder(); 
$parameters = array('marque'=>$marque, 'magasin'=>'%'.$matchesNumber[1].'%'); 
$qb->select('m') 
    ->from('Entities\Marque', 'm') 
    ->leftJoin('m.magasin', 'ma') 
    ->where('m.nom = :marque') 
    ->andWhere('ma.nom LIKE :magasin') 
    ->setParameters($parameters); 

$results = $qb->getQuery()->getArrayResult(); 
10

Điều này cũng xảy ra nếu bạn vô tình sử dụng nhiều hơn where(), điều này đã xảy ra với tôi một lần.

$em = $this->getEntityManager(); 
$query = $em->createQueryBuilder() 
    ->from('AppBundle:SomeEntity', 's') 
    ->select('s') 
    ->where('s.foo = :foo') 
    ->where('s.bar = :bar') // <- HERE 
    ->setParameter('foo', 'Foo Value') 
    ->setParameter('bar', 'Bar Value'); 

nên là:

$em = $this->getEntityManager(); 
$query = $em->createQueryBuilder() 
    ->from('AppBundle:SomeEntity', 's') 
    ->select('s') 
    ->where('s.foo = :foo') 
    ->andWhere('s.bar = :bar') // <- CHANGE TO andWhere() 
    ->setParameter('foo', 'Foo Value') 
    ->setParameter('bar', 'Bar Value'); 

Hope this helps một ai đó.

Các vấn đề liên quan