Cakephp复杂有很多关系查询

时间:2012-03-14 11:00:37

标签: cakephp

我是CakePHP的新手。我想像我这样在我的数据库中进行查询

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个模型:Member,Listing和ListingPicture,每个模型都有以下关系

  • 会员拥有多个上市
  • 列出了很多ListingPicture
  • 列出belongsTo Member
  • ListingPicture belongsTo Listing

从我的会员控制器如何执行上述查询?

我试过

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

...虽然效果很好但是我添加了这样的条件:

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

...我收到了错误。

因为我是CakePHP的新手,所以我不知道怎么看错误。

有人可以告诉我如何执行此查询吗?

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

您应该在将ListPicture绑定到列表时给出条件。

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