0

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

/玛顿

4

1 回答 1

0

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

是的,您可以使用 JOIN 进行分页。只需在实际调用$this->paginate();. (网上有很多关于如何使用 JOIN 进行分页的资源)

于 2013-03-13T17:48:45.857 回答