在编辑帖子时检索属于帖子的所有标签

时间:2013-01-14 23:06:29

标签: php cakephp has-and-belongs-to-many

我有两个模型,PostTag,它们是以HABTM关系设置的,如下所示:

class Post extends AppModel {
    public $hasAndBelongsToMany = array('Tag');
}

class Tag extends AppModel {    
    public $hasAndBelongsToMany = array('Post');
}

编辑帖子时,我想在输入框中显示属于此帖子的所有标签。

现在我在帖子控制器中有这个:

$this->set('tags', $this->Post->Tag->find('list'));

但由于某种原因,它会返回 tags表中的每个标记,而不是仅返回属于该帖子的标记。

如何修改它以便它只检索属于我正在编辑的帖子的标签?

1 个答案:

答案 0 :(得分:0)

使用find()函数的方式意味着您需要所有行标记表。

在你的模特中:

class Post extends AppModel {


/**
 * @see Model::$actsAs
 */
    public $actsAs = array(
        'Containable',
    );


        public $hasAndBelongsToMany = array('Tag');
}

class Tag extends AppModel {    

/**
 * @see Model::$actsAs
 */
    public $actsAs = array(
        'Containable',
    );

    public $hasAndBelongsToMany = array('Post');
}

您应该以这种方式使用find功能:

$postWithTag = $this->Post->find('first', array('conditions' => array('Post.id' => $post_id),'contain'=>array('Tag')));

它返回Post及其标签。

如果你只想要没有帖子的标签你应该在PostTag模型中放置belongsTo关系:

class PostTag extends AppModel {    

/**
 * @see Model::$belongsTo
 */
    public $belongsTo = array(
        'Post','Tag'
    );
}

然后以这种方式使用find函数:

class PostController extends AppController {

/**
 * @see Controller::$uses
 */
    public $uses = array(
        'Post', 'PostTag'
    );

    public function post(){

          /**
           * Your code
           */
          $tags = $this->PostTag->find('all', array('conditions' => array('PostTag.post_id' => $post_id)));
          $this->set('tags',$tags);
    }