CakePHP多HABTM与分页相关联

时间:2011-02-18 13:55:59

标签: cakephp pagination cakephp-1.3 has-and-belongs-to-many

对于我正在构建的电子商务应用,我正在使用CakePHP。 我创建了数据库,然后用cake bake烘焙了我的应用程序。 我的模型都正确连接如下:

Product hasMany CategoryProduct,ImagesProduct

Category hasMany CategoryProduct

CategoryProduct belongsTo Product,Category

Image hasMany ImagesProduct

ImagesProduct belongsTo Product,Image

我已尝试以各种方式获取依赖于category_id且没有成功的产品的分页视图。 我设法获得了我想要的数组 $this->CategoryProducts->findByCategoryId($id),但我无法使用cakePHP中的内置分页器和结果数组。

有人可以告诉我如何正确地制定$options['joins']数组以传递给paginate函数以获得相同的结果,但是以分页的方式?

我想做的SQL将是这样的:

SELECT p . * , i.filename FROM products p LEFT JOIN ( category_products cp, categories c, images_products ip, images i ) ON ( cp.product_id = p.id AND c.id = cp.category_id AND c.id =2 AND ip.product_id = p.id AND ip.image_id = i.id )

1 个答案:

答案 0 :(得分:1)

这个问题困扰了我很长一段时间。如果您正在使用与CakePHP的HABTM关联,则不必将任何连接模型(CategoryProduct,ImagesProduct)直接关联到模型。如果您没有正确的表名,cake bake可能无法正确选择HABTM关联。联接表应为categories_productsimages_products,这将构成联接模型CategoriesProductImagesProduct

无论哪种方式,以下内容都可以让您按类别进行过滤:

//in products_controller.php:

//Fake a HasOne association, setting the reset parameter to false since pagination
//requires two queries to complete (one for the count, one for the data)

$this->Product->bindModel(array(
    'hasOne' => array(
        'CategoriesProduct
    )
), false);

//Group by products since the HasOne will return multiple rows for each product

$options = array(
    'group' => 'Product.id',
    'conditions' => array(
        'CategoriesProduct.category_id' => $categories
    )
);

//To paginate the result:

$this->paginate = $options;
$products = $this->paginate();

在此示例中,$ categories可以是单个category_id,也可以是包含category_ids的数组(即array('1', '2', '3'))。结果将是类别的“OR”。如果您希望按“与”类型条件进行过滤,请选中http://edblogs.cal.msu.edu/devteam/2011/02/08/cakephp-habtm-searches/

希望这有帮助。