为什么cakePHP不包含我在一个SQL查询中的所有关联?我能够做到这一点的唯一方法是使用“连接”,但我希望belongsTo和Containable行为就足够了。
这是一个例子: 后> belongsTo->类别 - > 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上订购此查询变得困难。 有什么建议吗?
如果只有连接选项,我是否必须在查询前取消绑定模型? 分页是否可以与连接一起使用?
请注意!这只是所有模型的一小部分,由此产生的后>索引也需要通过类似的关联来获取许多其他模型。
(在蛋糕2.2.0和v2.4.0-dev,php v5.4.11上测试)
UPDATE! ---------
我只想表明我的发现。我现在已经解决了这个没有连接的问题,但我不得不在模型中重新绑定以使其正常工作。
这基本上是我为了让它工作而做的事情(也有分页和排序): 在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
/马顿
答案 0 :(得分:0)
是的,您必须使用JOIN才能根据相关的模型结果进行排序。
是的,您可以使用JOIN进行分页。在实际调用$this->paginate();
之前,只需将您的选项(包括JOIN)传递给您的分页。 (网上有很多关于如何用JOIN进行分页的资源)