我有两个模型,Post
和Tag
,它们是以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
表中的每个标记,而不是仅返回属于该帖子的标记。
如何修改它以便它只检索属于我正在编辑的帖子的标签?
答案 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);
}