cakephp - 如何在 CakePHP 的包含模型中查找类别

标签 cakephp

我最近有一个关于 Finding records via conditions in habtm 的问题。现在,我可以在我搜索的类别中搜索帖子。

现在,我的问题是如何检索每个帖子的类别。有时,一篇文章在此查询中包含一个或多个类别:

$this->set('posts', $this->Category->find(
    'first',
    array(
        'conditions' => array(
            'Category.uri' => $uri
        ),
        'contain' => array('Post')
    )
));

我想象这样的事情:

$this->set('posts', $this->Category->find(
    'first',
    array(
        'conditions' => array(
            'Category.uri' => $uri
        ),
        'contain' => array('Post' => array(
            'contain' => 'Category'
        ))
    )
));

这是我的模型的样子。

// Category Model
class Category extends AppModel {
    var $name = 'Category';
    var $hasAndBelongsToMany = array(
        'Post' => array(
            'className' => 'Post'
        )
    );
    var $actsAs = array('Containable');
}

// Post Model
    class Post extends AppModel {
        var $name = 'Post';
        var $hasAndBelongsToMany = array(
            'Category' => array(
                'className' => 'Category'
            )
        );
        var $actsAs = array('Containable');
        var $virtualFields = array(
            'date_posted' => 'DATE_SUB(Post.created, INTERVAL 7 DAY)'
        );
    }

示例数据如下:

categories
id name
1  holidays
2  destinations

posts
id title
1  I am a post
2  I am another post

categories_posts
post_id category_id
1       1
2       2
2       1

我正在检索假期的帖子。

Array
(
    [Category] => Array
        (
            [id] => 3
            [name] => holidays
            [uri] => holidays
            [created] => 2010-11-25 20:43:03
            [modified] => 2010-11-25 20:43:03
        )

    [Post] => Array
        (
            [0] => Array
                (
                    [id] => 1
                    [title] => I am a post
                ),
            [1] => Array
                (
                    [id] => 2
                    [title] => I am a another post
                )
        )
)

问题是其中 1 个帖子属于两个类别。我也希望获得这些信息。

最佳答案

关闭。试试这个:

$this->set('posts', $this->Category->find(
    'first',
    array(
        'conditions' => array(
            'Category.uri' => $uri
        ),
        'contain' => array('Post' => array('Category'))
    )
));

切线

像这样编写 Controller 代码有问题:

  1. 它会使您的 Controller 方法变得臃肿并降低 Controller 的可读性。
  2. 它会阻止您在不同 Controller 之间重复使用业务逻辑。

您可以通过将 find 调用移至模型方法来令人满意地纠正这些问题:

// Categories Controller
$this->set('posts', $this->Category->get_posts_with_cats($uri));

// Category Model
function get_posts_with_cats($uri) {
    $this->find('first', array(
        'conditions' => array('Category.uri' => $uri),
        'contain' => array('Post' => array('Category'))
    ));
}

这使您的代码更棒:

  1. Controller 很好,Skinny ,而且 super 可读。
  2. 现在您可以从任何关联模型调用相同的方法。因此,例如,在您的 PostsController 中,您可以调用:$this->Post->Category->get_posts_with_cats($uri);。您的代码现在是 DRY .

切线#2

在您学习如何像我向您展示的那样嵌套可容纳模型之后,您将来可能会想做这样的事情:

$this->find('first', array(
        'conditions' => array('Category.uri' => $uri),
        'contain' => array(
            'Post' => array(
                'Category' => array(
                    'Tag' => array('Author')
                )
            )
        )
    ));

好消息?您将从上述方法中获得所需的模型数据(只要您定义了所有这些关系)。

可怕的消息? CakePHP 不知道如何优化此类深层关联的查询。因此,随着数据库的增长,您最终将会对数据库进行数十个(如果不是数百个(如果不是数千个))SELECT 查询,从而有效地使您的应用程序陷入困境(如果不是< em>停下来。)

设计 CakePHP 的优秀人员正在为 CakePHP 2.0 开发更好的可控制行为,但您必须等到那时才能获得这种精度级别。

关于cakephp - 如何在 CakePHP 的包含模型中查找类别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4306957/

相关文章:

php - cakephp 插件样式和脚本

php - Cakephp 3 : Set virtual property with condition on belongsToMany association

javascript - 提交表单后css文件丢失

View 中的 Cakephp 文本区域换行符

cakephp - 如何从 CakePHP GitHub 存储库下载 CakePHP 1.3?

css - 如何显示透明且可点击的图像?

ajax - CakePHP,找不到助手类 AjaxHelper

json - 自定义 JSON 输出 CakePHP

Cakephp 3 : How to give condition in get method?

cakephp - cakePHP 中的 save() 方法