使用CakePHP 2.0进行HABTM查找

使用CakePHP 2.0进行HABTM查找,cakephp,cakephp-2.0,Cakephp,Cakephp 2.0,我正在尝试进行搜索,对带有一个或多个特定标记的帖子进行分页(例如,如果用户选择两个标记,则将返回包含其中任何一个标记的帖子) 我在我的Posts表中定义了关系 public $hasAndBelongsToMany = array('Tags' => array( 'className' => 'Tags', 'joinTable' => 'posts_tags',

我正在尝试进行搜索,对带有一个或多个特定标记的帖子进行分页(例如,如果用户选择两个标记,则将返回包含其中任何一个标记的帖子)

我在我的Posts表中定义了关系

public $hasAndBelongsToMany = array('Tags' => array(
            'className'              => 'Tags',
            'joinTable'              => 'posts_tags',
            'foreignKey'             => 'post_id',
            'associationForeignKey'  => 'tag_id',
            'unique'                 => 'keepExisting'));
如何使用Find检索具有给定标记(名称或ID可以)的行

尝试:

// other pagination settings goes here
$this->paginate['conditions']['Tags.id'] = 13;
给我一个错误,关系不存在

查看调试信息,表似乎没有加入Posts_Tags和Tags表,但是,当我调试数据使其进入视图时,Posts对象包含Tags数据


我能找到的大多数文档似乎都是围绕CakePHP的早期版本编写的,如果有任何帮助,我们将不胜感激。

我认为最好的解决方案是在联接表模型上应用find函数。我以前试过这个,效果很好

在PostTag模型中:

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

/**
 * @see Model::$belongsTo
 */
    public $belongsTo = array(
        'Post' => array(
            'className' => 'Post',
            'foreignKey' => 'post_id',
        ),
        'Tags' => array(
            'className' => 'Tag',
            'foreignKey' => 'tag_id',
        ),
    );
在控制器中:

   // $tagsId = tags ids
    $posts = $this->PostTag->find('all', array('conditions' => array('PostTag.tag_id' => $tagsId),'contain' => array('Post')));

此外,最好遵循cake命名约定,如果有标记(复数)、post_标记(第一个单数第二个复数)、post(复数)表,则必须有标记、PostTag、PostModels。

我认为最好的解决方案是在联接表模型上应用find函数。我以前试过这个,效果很好

在PostTag模型中:

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

/**
 * @see Model::$belongsTo
 */
    public $belongsTo = array(
        'Post' => array(
            'className' => 'Post',
            'foreignKey' => 'post_id',
        ),
        'Tags' => array(
            'className' => 'Tag',
            'foreignKey' => 'tag_id',
        ),
    );
在控制器中:

   // $tagsId = tags ids
    $posts = $this->PostTag->find('all', array('conditions' => array('PostTag.tag_id' => $tagsId),'contain' => array('Post')));

此外,最好遵循蛋糕命名约定,如果您有标签(复数)、post_标签(第一个单数第二个复数)、post(复数)表,则必须有标签、POSTAG、post模型。

我自己找不到满意的解决方案。 我创造了一种行为来处理这个问题

创建一个名为HabtmBehavior.php的文件,并将其放在app/Model/Behavior文件夹中。 将代码块放入其中并保存文件

将行为添加到模型中:例如public$actsAs=array('Habtm')

下面是一个使用find的示例

<?php $this->Entry->find('all', array('habtm'=>array('Tag'=>array('Tag.title'=>'value to find'))) ?>
通过在habtm数组中添加其他模型名称,您可以随意添加任意数量的关系。 (只是要小心不要让它变得复杂,因为这可能会减慢查找结果的速度。)


我自己找不到满意的解决方案。
我创造了一种行为来处理这个问题

创建一个名为HabtmBehavior.php的文件,并将其放在app/Model/Behavior文件夹中。 将代码块放入其中并保存文件

将行为添加到模型中:例如public$actsAs=array('Habtm')

下面是一个使用find的示例

<?php $this->Entry->find('all', array('habtm'=>array('Tag'=>array('Tag.title'=>'value to find'))) ?>
通过在habtm数组中添加其他模型名称,您可以随意添加任意数量的关系。 (只是要小心不要让它变得复杂,因为这可能会减慢查找结果的速度。)


检查相关表中的外键名称。该表的架构如下:创建表
posts\u标记
id
int(10)unsigned NOT NULL自动递增,
post\u id
int(10)unsigned NOT NULL,
tag\u id
int(10)unsigned NOT NULL,主键(
id
),KEY
post\u tags\u post\u id\u fk
post\u id
),KEY
post\u tag\u id\u fk
tag\u id
),约束
post\u id\u fk
外键(
post\u id
)引用
posts
id
)在更新级联的删除级联上,约束
post_tags\u tag\u id\u fk
外键(
tag\u id
)在更新级联的删除级联上引用
tags
id
);将外键名称检查到相关表中。表的架构如下所示:创建表
posts\u tags
id
int(10)unsigned NOT NULL自动递增,
post\u id
int(10)unsigned NOT NULL,
tag\u id
int(10)unsigned NOT NULL,主键(
id
),KEY
post\u tags\u post\u id\u fk
post\u id
),KEY
post\u tag\u id\u fk
tag\u id
),约束
post\u id\u fk
外键(
post\u id
)引用
posts
id
)在更新级联的删除级联上,约束
post_tags\u tag\u id\u fk
外键(
tag\u id
)在更新级联的删除级联上引用
tags
id
);