Разбивка на страницы CakePHP с моделями HABTM
У меня возникли некоторые проблемы с созданием разбивки на страницы с отношениями HABTM. Во-первых, таблицы и взаимосвязи:
requests (id, to_location_id, from_location_id)
locations (id, name)
items_locations (id, item_id, location_id)
items (id, name)
Таким образом, Запрос имеет Местоположение, из которого поступает запрос , и Местоположение, в которое отправляется запрос . По этому вопросу меня беспокоит только местоположение "кому".
Request --belongsTo--> Location* --hasAndBelongsToMany--> Item
(* as "ToLocation")
В моем RequestController я хочу разбить на страницы все элементы в расположении запроса.
// RequestsController
var $paginate = array(
'Item' => array(
'limit' => 5,
'contain' => array(
"Location"
)
)
);
// RequestController::add()
$locationId = 21;
$items = $this->paginate('Item', array(
"Location.id" => $locationId
));
И это не удается, потому что это порождает это SQL:
SELECT COUNT(*) AS count FROM items Item WHERE Location.id = 21
Я не могу понять, как заставить его на самом деле использовать аргумент "содержать" $paginate
...
Есть идеи?
3 answers
После 3 дней поисков я нашел способ
var $paginate = array('Post'=>array('group'=>'Post.id'));
Рекомендуется добавить группу, потому что иногда мы будем получать повторяющиеся сообщения в разных категориях
$this->Post->bindModel(array('hasOne'=>array('CategoriesPost')), false);
$out = $this->paginate('Post', array('CategoriesPost.category_id'=>array(1,4,7,6)));
Добавьте false , чтобы использовать модель привязки ко всем запросам, а не только к следующему
Чтобы разбить HABTM на страницы, вам необходимо временно привязать модель соединения "hasOne" к модели, которую вы разбиваете на страницы:
// 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'));
Мне удалось немного заставить его работать, но решение совсем не кажется простым.
$items = $this->paginate(
$this->Request->ToLocation->Item,
array(
"Item.id IN ("
. "SELECT item_id FROM items_locations "
. "WHERE location_id = " . $locationId
. ")"
)
);