为什么 cakePHP 不将我所有的关联都包含在一个 SQL 查询中?我能够做到这一点的唯一方法是使用“加入”,但我希望 belongsTo 和 Containable 行为就足够了。
这是一个示例: Post->belongsTo->Category->belongsTo->category_type (所有模型均已正确设置并且可以正常工作。
在索引中列出带有分页的帖子,我试试这个:
public function index() {
$this->paginate = array( 'contain' => array('Category' => array('CategoryType')));
$this->set('posts', $this->paginate());
}
这会正确获取数组,但它在许多 SQL 中都是这样的:
SELECT `Post`.`id`, `Post`.`name`, `Post`.`content`, `Post`.`category_id`, `Category`.`id`, `Category`.`name`, `Category`.`category_type_id` FROM `unit_app`.`post` AS `Post` LEFT JOIN `unit_app`.`categories` AS `Category` ON (`Post`.`category_id` = `Category`.`id`) WHERE 1 = 1 LIMIT 20
SELECT `CategoryType`.`id`, `CategoryType`.`name` FROM `unit_app`.`category_types` AS `CategoryType` WHERE `CategoryType`.`id` = 1
SELECT `CategoryType`.`id`, `CategoryType`.`name` FROM `unit_app`.`category_types` AS `CategoryType` WHERE `CategoryType`.`id` = 2
SELECT `CategoryType`.`id`, `CategoryType`.`name` FROM `unit_app`.`category_types` AS `CategoryType` WHERE `CategoryType`.`id` = 2
这使得很难在 CategoryType.name ASC 上对该查询进行排序。有什么建议么?
如果连接是唯一的选择,我是否必须在查询之前取消绑定模型?分页可以与连接一起正常工作吗?
笔记!这只是所有模型的一小部分,生成的 post->index 还需要通过类似的关联获取许多其他模型。
(在 cake 2.2.0 和 v2.4.0-dev、php v5.4.11 上测试)
更新!---------
我只是想展示我的发现。我现在已经在没有连接的情况下解决了这个问题,但我必须在模型中重新绑定才能让它工作。
这基本上是我为使其工作所做的(也包括分页和排序): 在 Post 模型中:添加了一个绑定函数:
$this->unbindModel(array(
'belongsTo' => array('Category')
));
$this->bindModel(array(
'hasOne' => array(
'Category' => array(
'foreignKey' => false,
'conditions' => array('Category.id = Post.category_id')
),
'CategoryType' => array(
'foreignKey' => false,
'conditions' => array('CategoryType.id = Category.category_type_id')
))));
然后我将它添加到 Post 控制器中的索引中:
$this->Post->bindCategory();
$this->paginate = array('contain' => array('Category' ,'CategoryType'));
$this->set('posts', $this->paginate());
我包括表头也只是为了文档:
<th><?php echo $this->Paginator->sort('CategoryType.name', 'Type'); ?></th>
<th><?php echo $this->Paginator->sort('Category.name', 'Category'); ?></th>
我希望这篇文章也可以帮助其他人:)
我还将测试此行为,看看我是否也可以省略所有绑定函数:https ://github.com/siran/linkable/
蛋糕有很多插件,但蛋糕应该有插件的“认证”。在 github 上很难找到完全正常工作和测试过的 :)
我也想念一个像 railscasts.com 这样的网站,只是为了蛋糕:D
/玛顿