对于我正在构建的电子商务应用,我正在使用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 )
答案 0 :(得分:1)
这个问题困扰了我很长一段时间。如果您正在使用与CakePHP的HABTM关联,则不必将任何连接模型(CategoryProduct,ImagesProduct)直接关联到模型。如果您没有正确的表名,cake bake
可能无法正确选择HABTM关联。联接表应为categories_products
和images_products
,这将构成联接模型CategoriesProduct
和ImagesProduct
。
无论哪种方式,以下内容都可以让您按类别进行过滤:
//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/。
希望这有帮助。