gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 16:11:18 25 4
gpt4 key购买 nike

我最近有一个关于 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com