2012-02-03 16 views
7

bang Tài liệu:Làm thế nào để xác định một vài điều kiện tham gia trong vòng 1: 1 mối quan hệ trong Học thuyết 2

class Cart 
{ 
    // ... 

    /** 
    * @OneToOne(targetEntity="Customer", inversedBy="cart") 
    * @JoinColumn(name="customer_id", referencedColumnName="id") 
    */ 
    private $customer; 

    // ... 
} 

chú thích này thể hiện sql như:

JOIN Customer c ON c.id = cart.customer_id 

Và vấn đề là tôi cần phải bổ sung thêm so sánh ở đó, như:

JOIN Customer c ON c.id = cart.customer_id AND c.anotherField = <constant> 

Bất kỳ giải pháp nào cho điều đó?

UPD:

điều kiện bổ sung thực tôi cần bây giờ là <const> BETWEEN c.f1 AND c.f2

+0

Bạn đã cố gắng để xác định cột thứ hai tham gia với 'columnDefinition =" enum ('YOUR_CONSTANT') ")'? – jkucharovic

+0

Bạn có thể sử dụng queryBuilder khi thực hiện truy vấn? – CappY

+0

Thực ra, điều kiện thứ hai khó hơn một chút - tôi nghĩ nó không quan trọng đối với giải pháp * chung *. Hiện tại tôi cần 'AND GIỮA c.f1 VÀ c.f2' – zerkms

Trả lời

0

bạn có thể sử dụng từ khóa WITH để xác định thêm điều kiện tham gia, như bạn có thể thấy trong một số các examples.

tôi nghĩ rằng điều này sẽ giúp bạn có đi:

SELECT l, c FROM location 
INNER JOIN Customer c 
WITH CURRENT_TIMESTAMP() BETWEEN c.f1 AND c.f2 
WHERE CURRENT_TIMESTAMP() BETWEEN l.f1 AND l.f2 

tôi loại bỏ các khoản ON vì tôi nghĩ rằng không cần phải xác định một cách rõ ràng ON lĩnh vực của tham gia trừ khi họ không phải là những "tiêu chuẩn" (id của mỗi thực thể)

cũng thông báo cuộc gọi đến CURRENT_TIMESTAMP() chuyển thành số NOW() của MySQL. kiểm tra danh sách các chức năng tổng hợp khá hữu ích khác và các ngoại lệ here

+2

Không thực sự trả lời câu hỏi. Giả sử bạn chỉ muốn các bản ghi hoạt động, bạn có thể diễn đạt điều đó bằng ký pháp không? Hoặc vui lòng giải thích cách sử dụng đốm màu DQL đó để điền thuộc tính của một thực thể. – ficuscr

0

Dường như không có giải pháp nào cho vấn đề của bạn mà Doctrine có thể tự động thực hiện.

Vì @ficuscr đã cung cấp cho bạn giải pháp cho các truy vấn, chỉ còn một điều nữa để xử lý - kiểm tra các tiêu chí bổ sung của bạn và trả về cá thể khách hàng trong getter thành công và NULL khi không đáp ứng tiêu chí bổ sung.

class Cart 
{ 
    const VALUE = '<some_constant_value>'; 
    /** 
    * @OneToOne(targetEntity="Customer", inversedBy="cart") 
    * @JoinColumn(name="customer_id", referencedColumnName="id") 
    */ 
    private $customer; 

    // ... 

    /** 
    * @return Customer|null 
    */ 
    public function getCustomer() 
    { 
     if ($this->customer->getField1() <= self::VALUE 
      && $this->customer->getField2() >= self::VALUE 
     ) { 
      return $this->customer; 
     } 

     return null; 
    } 
} 

Nếu đây là One-To-Nhiều mối quan hệ, Collection Filtering API (aka Tiêu chuẩn) có thể được sử dụng để lọc các bộ sưu tập được tạo ra bởi ánh xạ:

use Doctrine\Common\Collections\Criteria; 

class Cart 
{ 
    const VALUE = '<some_constant_value>'; 
    /** 
    * @OneToMany(targetEntity="Customer", mappedBy="cart") 
    */ 
    private $customers; 

    // ... 

    /** 
    * @return Customer[]|ArrayCollection 
    */ 
    public function getCustomers() 
    { 
     $expr = Criteria::expr(); 
     $criteria = Criteria::create() 
      ->where($expr->andX(
       $expr->lte('field1', self::VALUE), 
       $expr->gte('field2', self::VALUE) 
      )); 

     return $this->patientProblems->matching($criteria); 
    } 
} 
Các vấn đề liên quan