2012-03-14 73 views
0

我對CakePHP很新穎。我想做一個查詢在我的數據庫這樣的Cakephp complex hasMany relationship 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' 

我在CakePHP的3種型號:會員,上市,並ListingPicture每個具有以下關係

  • 會員的hasMany上市
  • 上市的hasMany ListingPicture
  • 上市屬於關聯會員
  • ListingPicture屬於關聯上市

從我的成員控制器我如何執行上面的查詢?

我已經試過

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

...效果很好,但是當我添加了一個條件是這樣的:

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

...我得到一個錯誤。

因爲我是CakePHP的新手,我不知道如何查看錯誤。

任何人都可以告訴我如何執行此查詢?

回答

1

確保設置模型爲:

public $actsAs = array('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') 
)) 
);