HABTM modelleri ile sayfalama cakephp

3 Cevap php

Ben bir HABTM ilişki ile sayfalama oluşturma ile bazı sorunlar yaşıyorum. İlk olarak, tablolar ve ilişkiler:

requests (id, to_location_id, from_location_id)
locations (id, name)
items_locations (id, item_id, location_id)
items (id, name)

Yani, bir istek istek from geliyor Bir Yer ve İstek gidiyor bir var Konumu to. Bu soru için, ben konumu "" about sadece endişeliyim.

Request --belongsTo--> Location* --hasAndBelongsToMany--> Item

(* as "ToLocation")

Benim RequestController, ben bir istek en ToLocation tüm öğeler sayfalandırmamayı istiyorum.

// RequestsController
var $paginate = array(
    'Item' => array(
        'limit' => 5,
        'contain' => array(
            "Location"
        )
    )
);

// RequestController::add()
$locationId = 21;
$items = $this->paginate('Item', array(
    "Location.id" => $locationId
));

Bu SQL oluşturuyor çünkü bu, başarısız oluyor:

SELECT COUNT(*) AS count FROM items Item   WHERE Location.id = 21

Ben aslında bir "içeren" argüman kullanmak nasıl anlamaya olamaz $paginate ...

Herhangi bir fikir?

3 Cevap

3 gün arama yaptıktan sonra yolunu buldu

var $paginate = array('Post'=>array('group'=>'Post.id'));

Bazen farklı kategorilerde duplicte mesajları alırsınız çünkü, grup eklemek için önerilen oluyor

$this->Post->bindModel(array('hasOne'=>array('CategoriesPost')), false);
$out = $this->paginate('Post', array('CategoriesPost.category_id'=>array(1,4,7,6)));

Ekle false, sadece aşağıdaki tüm sorgulara bağlama modelini kullanmak

Habtm sayfalandırmak için, geçici paginate hangi model modeli katılmak 'hasOne' bağlamak gerekiyor:

// prepare to paginate Item
$this->Item->bindModel(array('hasOne'=>array('ItemsLocation')));
$contain['ItemsLocation']=array();
$conditions[]=array('ItemsLocation.location_id'=>$locationId);
$order = array('Item.created' => 'desc'); // set order
...
$items = $this->paginate('Item', compact('conditions','contain','order'));

Ben biraz çalışma almak mümkün oldum, ama çözüm hiç çok cakey hissetmez.

$items = $this->paginate(
    $this->Request->ToLocation->Item,
    array(
        "Item.id IN ("
        . "SELECT item_id FROM items_locations "
        . "WHERE location_id = " . $locationId
        . ")"
    )
);