2013-05-01 5 views
0

Я нахожу 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», но и для все идентификаторы платформы.

+0

Он возвращает 'reviews', которые связаны с' Game'. Поэтому вы должны связывать 'обзоры' с' платформами'. – Preetam

+1

Почему вы используете Joins вместо [Super-amazing Containable Behavior, предоставляемого CakePHP] (http://book.cakephp.org/2.0/en/core-libraries/behaviors/containable.html)? – Dave

+0

Во-первых, спасибо Preetam за ваш комментарий. Я работал над решением, используя это, когда я оглянулся и увидел комментарий Дейва. Дэйв, я посмотрел на сдержанный и придумал решение, которое хотел: '$ this-> loadModel ('Review'); $ this-> Обзор-> найти ('все', массив ( 'содержит' => Array ('Платформа'), 'условия' => Array ( 'Review.platform_id' => 2 ) )); ' Я так мало использовал, поэтому должен добавить это решение к своему собственному ответу и пометить как решенный, или я должен ждать, пока вы опубликуете свой комментарий в качестве ответа, чтобы я мог дать вам кредит? Благодарю. – 2013-05-01 06:02:50

ответ

0

Решение

Используя комментарий Дэйва, я придумал это решение моей проблемы, используя Containable:

$this->loadModel('Review'); 
$this->Review->find('all', array('contain' => array('Platform'), 'conditions' => array('Review.platform_id' => 2) 
)); 
Смежные вопросы