2015-04-21 16 views
8

Bộ luật

Nói rằng tôi có hai mô hình, tên ProductImage, được liên kết bởi Product hasMany ImageImage belongsTo Product.Sử dụng giới hạn() trên mô hình chứa

Bây giờ, giả sử tôi muốn tìm nạp tất cả các sản phẩm có hình ảnh đầu tiên. Tôi sẽ sử dụng mã này:

$this->Products->find('all') 
    ->contain([ 
     'Images' => function($q) { 
      return $q 
       ->order('created ASC') 
       ->limit(1); 
     } 
    ]); 

Có vẻ đúng, phải không? Ngoại trừ bây giờ chỉ có một sản phẩm chứa hình ảnh, mặc dù thực tế mỗi sản phẩm chứa ít nhất một hình ảnh (nếu được truy vấn không có giới hạn).

Các kết quả truy vấn

Vấn đề có vẻ là với giới hạn, vì đây tạo ra hai truy vấn sau đây (ví dụ):

SELECT 
    Products.id AS `Products__id`, 
FROM 
    products Products 

SELECT 
    Images.id AS `Images__id`, 
    Images.product_id AS `Images__product_id`, 
    Images.created AS `Images__created` 
FROM 
    images Images 
WHERE 
    Images.product_id in (1,2,3,4,5) 
ORDER BY 
    created ASC 
LIMIT 1 

Nhìn vào truy vấn thứ hai, nó là khá rõ ràng như thế nào điều này sẽ luôn luôn dẫn đến chỉ có một hình ảnh.

Vấn đề

Tuy nhiên, tôi dự kiến ​​sẽ có các bánh ORM để hạn chế những hình ảnh tới 1 cho mỗi sản phẩm khi tôi gọi limit(1).

Câu hỏi của tôi: Đây có phải là lỗi trong cách tôi sử dụng ORM không? Nếu có, cách nên Tôi giới hạn số lượng hình ảnh là một hình ảnh như thế nào?

+0

Để tham khảo trong tương lai: Tôi đã kết thúc chỉ đơn giản là bỏ qua 'limit()' và chỉ sử dụng hình ảnh đầu tiên trong mảng. Tất cả các câu trả lời, trong khi làm việc, có vẻ như một cách giải quyết. Bánh ORM ** luôn ** sử dụng một truy vấn đơn chứa, ngay cả khi điều này là không mong muốn (như khi thêm giới hạn truy vấn). –

Trả lời

14

Cách sạch bạn có thể làm điều này là bằng cách tạo liên kết khác:

$this->hasOne('FirstImage', [ 
    'className' => 'Images', 
    'foreignKey' => 'image_id', 
    'strategy' => 'select', 
    'sort' => ['FirstImage.created' => 'DESC'], 
    'conditions' => function ($e, $query) { 
     $query->limit(1); 
     return []; 
    } 
]) 
+1

nhưng tôi không nhận được hàng cuối cùng, tôi đang nhận được một đầu tiên .can bạn plz đề nghị nhiều hơn? – sradha

+0

Cảm ơn bạn tôi đã nhận nó. Tôi thực sự làm việc. Tôi muốn upvote bạn. – sradha

+0

@sradha - làm cách nào bạn giải quyết vấn đề này? Tôi không thể sắp xếp trong mảng hasOne chính và thứ tự không hoạt động trong truy vấn điều kiện. Tôi chỉ có thể có được kết quả đầu tiên. – MiDri

0

Nếu lý do bạn giới hạn nó thành một hình ảnh là bạn muốn có hình ảnh mặc định. Bạn có thể cân nhắc việc thêm một lĩnh vực default trong bảng hình ảnh và làm một Bí danh như thế này:

var $hasOne = array(
    'CoverImage' => array(
     'className' => 'Image', 
     'conditions' => array('CoverImage.default' => true), 
    ), 

Dường như bạn đang sử dụng Bánh v3 vì vậy bạn chỉ có thể thêm các liên kết tương đương như ở trên là một mẫu 2.x .

2

Kiểm tra nó, cái này là mã của tôi

$this->Orders->hasOne('Collections', [ 
        'className' => 'Collections', 
        'foreignKey' => 'order_id', 
        'strategy' => 'select', 
        'conditions' => function (\Cake\Database\Expression\QueryExpression $exp, \Cake\ORM\Query $query) { 
        $query->order(['Collections.id' => 'ASC']); 
        return []; 
                                 } 
        ]); 


        $Lists = $this->Orders->find('all')->where($condition)->contain(['Collections'])->order(['Orders.due_date DESC']); 
        $this->set(compact('Lists')); 
Các vấn đề liên quan