cakePHP中的多级排序

时间:2013-03-13 16:50:45

标签: cakephp

为什么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

/马顿

1 个答案:

答案 0 :(得分:0)

是的,您必须使用JOIN才能根据相关的模型结果进行排序。

是的,您可以使用JOIN进行分页。在实际调用$this->paginate();之前,只需将您的选项(包括JOIN)传递给您的分页。 (网上有很多关于如何用JOIN进行分页的资源)