2012-03-14 5 views
0

Я очень новичок в CakePHP. Я хочу сделать запрос в моей базе данных, как этотCakephp complex hasMany query query

SELECT m.id, l.*, lp.picture_path 
FROM member m INNER JOIN listing l ON m.member_id = l.member_id 
INNER JOIN listingPicture lp ON l.listing_id = lp.listing_id 
WHERE lp.picture_default='1' 

У меня есть 3 модели в моей CakePHP: Член листинга и ListingPicture каждый со следующим соотношением

  • член hasMany Листинг
  • листингу hasMany ListingPicture
  • Листинг belongsTo Член
  • ListingPicture belongsTo Листинг

От моего контроллера-члена, как выполнить запрос выше?

Я попытался

$this->Member->Listing->find("all") 

... который работает хорошо, но когда я добавил условия, как это:

$this->Member->Listing->find('all', array(
    'conditions' => array('ListingPicture.picture_default'=>'1'))); 

... Я получаю сообщение об ошибке.

Поскольку я новичок в CakePHP, я не знаю, как увидеть ошибку.

Может кто-нибудь посоветует мне, как я могу выполнить этот запрос?

ответ

1

Убедитесь, чтобы установить модель как:

public $actsAs = array('Containable'); 

Затем используйте Containable поведение CakePHP, чтобы включать только связанные данные вы хотите, с заданными полями и условиями.

$this->Member->Listing->find('all', array(
    'fields' => array('*'), 
    'contain' => array(
     'Member' => array(
      'fields' => array('id') 
     ) 
     'ListingPicture' => array(
      'conditions' => array('ListingPicture.picture_default' => '1') 
      'fields' => array('picture_path') 
     ) 
    ) 
)); 

Чтобы следовать концепции MVC, предлагается сохранить ваши находки в Модели в отличие от контроллера. Это не требуется, но - намного легче узнать, где находятся все находки, и хранит мантру «Матовая модель/Тощий контроллер». В этом случае это будет примерно так:

//in the Member Controller 
$listings = $this->Member->Listing->getListings(); 

//in the Listing Model 
function getListings() { 
    $listings = $this->find('all', ... 
    return $listings; 
} 
0

Вы должны указать условие во время привязки ListPicture к листингу.

$this->Member->Listing->bindModel(array(
    'ListPicture'=>array(
    'condtions'=>array('ListingPicture.picture_default'=>'1') 
)) 
);