1

我正在使用可包含的 CakePHP。我尝试过的代码是...

 public function detail($slug = "") {
        $this->Poet->contain('User.id', 'User.full_name', 'Song.id', 'Song.name', 'Song.name_hindi', 'Song.slug');
        $result = $this->Poet->findBySlug($slug);
        if (!$result) {
            throw new NotFoundException(__('Invalid Poet - ' . $slug));
        }
        pr($result);
        die();
        $this->Poet->id = $result['Poet']['id'];
        $this->set('result', $result);
    }   

像这样。现在我将 Song.status 作为我与 Song 表的关联。我只想获取那些具有status = 1. 是否可以?我可以用我的代码只选择活动记录吗?

4

1 回答 1

2

使用普通查找

虽然神奇的 findBy* 方法有时很方便,但最好只将它们用于琐碎的查询 - 您的查询不再是琐碎的。而是使用正常的 find 调用,例如:

$result = $this->Poet->find('first', array(
    'contain' => array(
        'User' => array(
            'id', 
            'full_name'
        ),
        'Song' => array(
            'id', 
            'name',
            'name_hindi',
            'slug',
        )
    ),
    'conditions' => array(
        'slug' => $slug,
        'Song.status' => 1 // <-
    )
));

诗人有很多歌吗?

您没有在问题中提及您的关联,这对于提供准确的答案是相当重要的,但是似乎一位诗人可能有很多歌曲。考虑到这一点,第一个示例将生成一个 sql 错误,因为 Poet 和 Song 之间没有连接。

Containable 允许过滤相关数据,例如:

$result = $this->Poet->find('first', array(
    'contain' => array(
        'User' => array(
            'id', 
            'full_name'
        ),
        'Song' => array(
            'id', 
            'name',
            'name_hindi',
            'slug',
            'Song.status = 1' // <-
        )
    ),
    'conditions' => array(
        'slug' => $slug
    )
));

这将返回诗人(无论他们是否有相关歌曲),并且只返回状态为“1”的歌曲。您可以通过在关联定义中定义条件(直接在模型中或使用bindModel)来实现完全相同的效果。

于 2013-06-28T09:58:57.620 回答