#php #mysql #database #cakephp #paginator
#php #mysql #База данных #cakephp #Разбиение на страницы
Вопрос:
Я делаю это для разбиения на страницы всех сообщений, которые пользователь добавил в свои избранные:
$favs = $this->Favorite->find('all', array(
'fields' => array(
'Favorite.post_id'
),
'conditions' => array(
'Favorite.user_id' => $this->Auth->user('id')
)
));
$favs = Set::format($favs, '{0}', array('{n}.Favorite.post_id'));
$posts = $this->paginate('Post', array(
'Post.id' => $favs
));
Есть ли какой-либо более эффективный способ сделать это или так и должно быть?
Комментарии:
1. да, есть. Вам нужно выполнить SQL JOIN. Я бы дал вам ответ, но мой PHP слишком устарел, чтобы сделать это правильно. Если вы не получили ответа, спросите, как создать запрос JOIN, или погуглите его.
2. если вы хотите получить ответ от MySQL, пожалуйста, укажите макет таблицы.
Ответ №1:
На самом деле вам не нужно использовать здесь find
метод, потому что paginate
работает практически так же, как find
за исключением разбивки результатов на страницы.
Таким образом, вы могли бы делать то, что хотите, только используя paginate
метод.
Я сомневаюсь, что это значительно повысило бы производительность, но это сделало бы ваш код немного проще.
Ответ №2:
Спасибо, ребята, за ваши сообщения, но вчера я нашел простое решение. Я надеюсь, что это будет кому-то полезно
$posts = $this->paginate('Post', array(
'Post.id IN( (SELECT `Favorite` . `post_id` FROM `favorites` AS `Favorite` WHERE `Favorite`.`user_id` = ' . $this->Auth->user('id') . ') )'
));