Я нахожу find() на своей игровой модели, чтобы получить обзоры этой игры для конкретной платформы. Проблема в том, что вызов find(), похоже, не обращает внимания на мой массив условий. Вызов возвращает все отзывы для игры независимо от платформы_id.CakePHP find() и родственные модели и условия
У меня есть эти модели ассоциации:
- hasMany пользователя Обзор
- игры hasMany Обзор
- Обзор belongsTo игры
- Обзор belongsTo Пользователь
- Игра HABTM платформы
Это это вызов find, который я создал:
$options = array(
'group' => array(
'Game.id'
),
'joins' => array(
array(
'table' => 'reviews',
'type' => 'LEFT',
'conditions' => array(
'Game.id=reviews.game_id'
)
),
array(
'table' => 'platforms',
'type' => 'LEFT',
'conditions' => array(
'reviews.platform_id=platforms.id'
)
),
array(
'table' => 'users',
'type' => 'LEFT',
'conditions' => array(
'reviews.user_id=users.id'
)
)
),
'fields' => array(
'Game.id', 'Game.name',
'platforms.id', 'platforms.name',
'users.id', 'users.username'
),
'conditions' => array(
'AND' => array(
'NOT' => array('reviews.review_text' => NULL),
'platforms.id' => $pid,
)
),
'limit' => 5
);
$this->Game->find('all', $options);
Вот пример возвращения на находку() вызова для platform_id = 2:
array(
(int) 0 => array(
'Game' => array(
'id' => '58',
'name' => 'Bioshock 2'
),
'platforms' => array(
'id' => '2',
'name' => 'PlayStation 3'
),
'users' => array(
'id' => '20',
'username' => 'pspmaniac'
),
'Review' => array(
(int) 0 => array(
'id' => '32',
'review_text' => 'This is the PC review.',
'score' => '4',
'user_id' => '20',
'game_id' => '58',
'created' => '2013-04-30 19:59:40',
'platform_id' => '10'
),
(int) 1 => array(
'id' => '33',
'review_text' => 'This is the PS3 review.',
'score' => '7',
'user_id' => '20',
'game_id' => '58',
'created' => '2013-04-30 20:00:04',
'platform_id' => '2'
),
(int) 2 => array(
'id' => '34',
'review_text' => 'This is the XBOX 360 review.',
'score' => '6',
'user_id' => '20',
'game_id' => '58',
'created' => '2013-04-30 20:00:22',
'platform_id' => '1'
)
)
)
);
В индексе 'Review', он возвращает три рецензии к игре (платформа IDS 10, 2 , и 1) когда он должен только возвратить обзор с помощью platform_id = 2.
Это мой reviews
стол:
CREATE TABLE reviews
(
id mediumint unsigned not null auto_increment,
review_text mediumint,
score int not null,
user_id mediumint unsigned not null,
game_id mediumint unsigned not null,
PRIMARY KEY (id),
FOREIGN KEY (user_id) REFERENCES users (id),
FOREIGN KEY (game_id) REFERENCES games (id)
);
Таким образом, в конце концов, единственное, что не так с возвращенного массива является то, что он содержит отзывы не только для состояния «platforms.id = 2», но и для все идентификаторы платформы.
Он возвращает 'reviews', которые связаны с' Game'. Поэтому вы должны связывать 'обзоры' с' платформами'. – Preetam
Почему вы используете Joins вместо [Super-amazing Containable Behavior, предоставляемого CakePHP] (http://book.cakephp.org/2.0/en/core-libraries/behaviors/containable.html)? – Dave
Во-первых, спасибо Preetam за ваш комментарий. Я работал над решением, используя это, когда я оглянулся и увидел комментарий Дейва. Дэйв, я посмотрел на сдержанный и придумал решение, которое хотел: '$ this-> loadModel ('Review'); $ this-> Обзор-> найти ('все', массив ( 'содержит' => Array ('Платформа'), 'условия' => Array ( 'Review.platform_id' => 2 ) )); ' Я так мало использовал, поэтому должен добавить это решение к своему собственному ответу и пометить как решенный, или я должен ждать, пока вы опубликуете свой комментарий в качестве ответа, чтобы я мог дать вам кредит? Благодарю. – 2013-05-01 06:02:50