Връщане на стойности с външен ключ 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