Возврат значений с помощью внешнего ключа CakePHP

В настоящее время я добавляю в блог пример из документации CakePHP и создал таблицу пользователей, чтобы назначать сообщения определенному пользователю, и я добавил поле user_id в свою таблицу сообщений.

Я написал следующую функцию в своем контроллере сообщений:

public function viewuser($user_id = null){

    if (!$this->Post->exists($user_id)) {
        throw new NotFoundException(__('Invalid user'));
    }
    $options = array('conditions' => array('Post.user_id' => $user_id));
    $this->set('posts', $this->Post->find('all', $options));
}

но он возвращает все сообщения всех пользователей, когда я обращаюсь к http://localhost/cake-app/posts/viewuser/1 и http://localhost/cake-app/posts/viewuser/2, а не только к сообщениям пользователя с опубликованным значением $user_id.

Может ли кто-нибудь помочь мне с этой проблемой? Я новичок в CakePHP, так что, вероятно, это простое решение.

РЕДАКТИРОВАТЬ. Сгенерированный SQL выглядит следующим образом:

1   SELECT COUNT(*) AS `count` FROM `jaredisalie`.`posts` AS `Post` WHERE `Post`.`id` = 1   
2   SELECT `Post`.`id`, `Post`.`title`, `Post`.`user_id`, `Post`.`imageurl`, `Post`.`category_id`, `Post`.`summary`, `Post`.`content`, `Post`.`created`, `Post`.`modified`, `Category`.`id`, `Category`.`title`, `User`.`id`, `User`.`username`, `User`.`name`, `User`.`password`, `User`.`role`, `User`.`created`, `User`.`modified` FROM `jaredisalie`.`posts` AS `Post` LEFT JOIN `jaredisalie`.`categories` AS `Category` ON (`Post`.`category_id` = `Category`.`id`) LEFT JOIN `jaredisalie`.`users` AS `User` ON (`Post`.`user_id` = `User`.`id`) WHERE `Post`.`user_id` = 1      
3   SELECT `Category`.`id`, `Category`.`title` FROM `jaredisalie`.`categories` AS `Category` WHERE 1 = 1        
4   SELECT `Posts`.`id`, `Posts`.`title`, `Posts`.`user_id`, `Posts`.`imageurl`, `Posts`.`category_id`, `Posts`.`summary`, `Posts`.`content`, `Posts`.`created`, `Posts`.`modified` FROM `jaredisalie`.`posts` AS `Posts` WHERE `Posts`.`category_id` IN (1, 2, 3)      
5   SELECT `Post`.`id`, `Post`.`title`, `Post`.`user_id`, `Post`.`imageurl`, `Post`.`category_id`, `Post`.`summary`, `Post`.`content`, `Post`.`created`, `Post`.`modified`, `Category`.`id`, `Category`.`title`, `User`.`id`, `User`.`username`, `User`.`name`, `User`.`password`, `User`.`role`, `User`.`created`, `User`.`modified` FROM `jaredisalie`.`posts` AS `Post` LEFT JOIN `jaredisalie`.`categories` AS `Category` ON (`Post`.`category_id` = `Category`.`id`) LEFT JOIN `jaredisalie`.`users` AS `User` ON (`Post`.`user_id` = `User`.`id`) WHERE 1 = 1 ORDER BY `Post`.`modified` desc LIMIT 20        
6   SELECT COUNT(*) AS `count` FROM `jaredisalie`.`posts` AS `Post` LEFT JOIN `jaredisalie`.`categories` AS `Category` ON (`Post`.`category_id` = `Category`.`id`) LEFT JOIN `jaredisalie`.`users` AS `User` ON (`Post`.`user_id` = `User`.`id`) WHERE 1 = 1

person jazibobs    schedule 19.06.2013    source источник
comment
Покажите сгенерированный SQL-запрос.   -  person floriank    schedule 20.06.2013


Ответы (2)


во-первых, проверка $this->Post->exists() с помощью $user_id не даст желаемого исключения. Я думаю, вы хотите проверить, существует ли User, вместо этого используйте $this->Post->User->exists().

Во-вторых, проверьте имена ваших моделей и отношения между ними (в Category, Post, User - модели). У вас каким-то образом есть Posts и Post модель в вашем SQL. Я думаю, вы добавили 's' там, где его быть не должно;)

person Christoph Paster    schedule 20.06.2013
comment
+1 за последний пункт. Судя по запросам, модель категории, вероятно, определена как Category hasMany PostS. - person AD7six; 20.06.2013
comment
Спасибо, вы были правы насчет ошибок модели во множественном числе и моего общего отсутствия знаний о cakephp: D - person jazibobs; 20.06.2013

Вы перезаписываете свои переменные

Этот кусок кода:

$options = array('conditions' => array('Post.user_id' => $user_id));
$this->set('posts', $this->Post->find('all', $options));

Отвечает за запрос 2:

SELECT ... FROM `jaredisalie`.`posts` ... WHERE `Post`.`user_id` = 1      

Это делает именно то, что вы ожидаете. Это последний запрос, относящийся к коду в вопросе, но есть еще 4 запроса.

Очевидно/очевидно, что после этого в том же запросе из запросов 5 и 6 есть последующие находки по модели поста:

SELECT ... FROM `jaredisalie`.`posts` AS `Post` ... WHERE 1 = 1 ORDER BY `Post`.`modified` desc LIMIT 20        
SELECT COUNT(*) AS `count` FROM `jaredisalie`.`posts` AS `Post` ... WHERE 1 = 1

Таким образом, в коде, который вы используете, но не в вопросе, вероятно, есть такая строка:

$this->set('posts', $this->paginate());

Или подобное - либо используйте другое имя переменной, либо, если оно не нужно, просто удалите его.

У вас логическая ошибка

Этот код:

if (!$this->Post->exists($user_id)) {
    throw new NotFoundException(__('Invalid user'));
}

И первый запрос:

SELECT COUNT(*) AS `count` FROM `jaredisalie`.`posts` AS `Post` WHERE `Post`.`id` = 1 

Нелогичны. Переменная (предположительно) является идентификатором пользователя, но вы проверяете, существует ли сообщение с этим идентификатором.

person AD7six    schedule 20.06.2013