2012-03-14 61 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') 
)) 
);