2013-03-13 31 views
27

Tôi muốn xây dựng SQL sau đây sử dụng xây dựng truy vấn Học thuyết của:Học thuyết xây dựng truy vấn sử dụng bên trong tham gia với điều kiện

select c.* 
from customer c 
join phone p 
on p.customer_id = c.id 
and p.phone = :phone 
where c.username = :username 

Đầu tiên tôi đã cố gắng

$qb->select('c') 
    ->innerJoin('c.phones', 'p', Join::ON, $qb->expr()->andx(
     $qb->expr()->eq('p.customerId', 'c.id'), 
     $qb->expr()->eq('p.phone', ':phone') 
    )) 
    ->where('c.username = :username'); 

Nhưng tôi nhận được lỗi sau

Error: expected end of string, got 'ON' 

Sau đó, tôi đã cố gắng

$qb->select('c') 
    ->innerJoin('c.phones', 'p') 
    ->where('c.username = :username') 
    ->andWhere('p.phone = :phone'); 

có vẻ như đang hoạt động. Tuy nhiên, có ai biết điều gì sai với lần thử đầu tiên không? Tôi muốn thực hiện công việc đầu tiên vì nó giống với cách cấu trúc SQL chặt chẽ hơn. Cảm ơn trước!

Lưu ý: Tôi biết chúng tôi cũng có thể viết mysql hoặc dql gốc với Doctrine, nhưng tôi thích trình tạo truy vấn.

EDIT: Dưới đây là toàn bộ mã

namespace Cyan\CustomerBundle\Repository; 

use Cyan\CustomerBundle\Entity\Customer; 
use Doctrine\ORM\EntityRepository; 
use Doctrine\ORM\Query\Expr\Join; 

class CustomerRepository extends EntityRepository 
{ 
    public function findCustomerByPhone($username, $phone) 
    { 
     $qb = $this->createQueryBuilder('c'); 

     $qb->select('c') 
      ->innerJoin('c.phones', 'p', Join::ON, $qb->expr()->andx(
       $qb->expr()->eq('p.customerId', 'c.id'), 
       $qb->expr()->eq('p.phone', ':phone') 
      )) 
      ->where('c.username = :username'); 

//  $qb->select('c') 
//   ->innerJoin('c.phones', 'p') 
//   ->where('c.username = :username') 
//   ->andWhere('p.phone = :phone'); 

     $qb->setParameters(array(
      'username' => $username, 
      'phone' => $phone->getPhone(), 
     )); 

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

bạn có thể vui lòng cung cấp toàn bộ thông báo lỗi? – hacfi

+1

QueryException: [Lỗi cú pháp] dòng 0, col 74: Lỗi: Dự kiến ​​kết thúc chuỗi, nhận 'ON' –

Trả lời

61

Tôi sẽ trả lời câu hỏi của riêng mình.

  1. innerJoin nên sử dụng từ khóa "VỚI" thay vì "ON" (Giáo lý của tài liệu là không chính xác [13.2.6 phương pháp Helper.]; [13.2.5 Lớp expr.] Là đúng)
  2. không cần để liên kết các khóa ngoại trong điều kiện nối khi chúng đã được chỉ định trong ánh xạ thực thể.

Do đó, các công trình sau đây cho tôi

$qb->select('c') 
    ->innerJoin('c.phones', 'p', 'WITH', 'p.phone = :phone') 
    ->where('c.username = :username'); 

hoặc

$qb->select('c') 
    ->innerJoin('c.phones', 'p', Join::WITH, $qb->expr()->eq('p.phone', ':phone')) 
    ->where('c.username = :username'); 
+1

Bạn có thể hoàn thành nó bằng setParameters() cho cả hai: điện thoại và: tên người dùng? Tôi có một '' 'Số tham số không hợp lệ: số biến bị ràng buộc không khớp với số mã thông báo''' – lrkwz

+2

Bạn đặt điều kiện gì với WITH WITH a WHERE? –

8

Bạn rõ ràng có thể có một tham gia như thế này:

$qb->innerJoin('c.phones', 'p', Join::ON, 'c.id = p.customerId'); 

Nhưng bạn cần phải sử dụng các không gian tên của lớp Tham gia từ học thuyết:

use Doctrine\ORM\Query\Expr\Join; 

Hoặc nếu bạn đặt trước như thế:

$qb->innerJoin('c.phones', 'p', Doctrine\ORM\Query\Expr\Join::ON, 'c.id = p.customerId'); 

Nếu không, Join class sẽ không được phát hiện và kịch bản của bạn sẽ sụp đổ ...

Ở đây các nhà xây dựng của phương pháp innerJoin:

public function innerJoin($join, $alias, $conditionType = null, $condition = null); 

Bạn có thể tìm thấy những khả năng khác (không chỉ tham gia "BẬT", nhưng cũng "CÓ", v.v.) tại đây: http://docs.doctrine-project.org/en/2.0.x/reference/query-builder.html#the-expr-class

EDIT

nghĩ nó nên là:

$qb->select('c') 
    ->innerJoin('c.phones', 'p', Join::ON, 'c.id = p.customerId') 
    ->where('c.username = :username') 
    ->andWhere('p.phone = :phone'); 

    $qb->setParameters(array(
     'username' => $username, 
     'phone' => $phone->getPhone(), 
    )); 

Nếu không tôi nghĩ rằng bạn đang thực hiện một kết hợp của ON và VỚI, có lẽ là vấn đề.

+0

Cảm ơn bạn đã chỉ ra điều đó. Nhưng tôi đã có không gian tên bao gồm. Tôi thậm chí đã thử sử dụng chuỗi 'ON' trực tiếp. –

+0

Bạn có thể hiển thị cho chúng tôi truy vấn đầy đủ mà bạn viết (từ đầu đến cuối) không? – Sybio

+0

Tôi đã chỉnh sửa bài đăng. Cảm ơn! –

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