我有一个包含动态字段(规范)和过滤器的在线商店。所有规格都存储在表格中,例如
product_specifications:
-id
-product_id
-spec_id
-spec_val_id
过滤器与规格连接,因此当我发送过滤器值时,我发送规格值。例如
$_GET['Filters']['filter_id']['spec_val_id']
当我循环过滤器时,我想在产品查询中添加左连接。像这样的东西
$joinString = "";
foreach($filters){
$joinString .= "LEFT JOIN product_specifications AS prod_'.filter.' ON .....";
}
我对ActiveDataProvider的查询是这样的:
$prodQuery = Product::find()->joinWith('translation')->joinWith('cats')->[HERE FILTERS JOINS]->where($whereString)->groupBy(['id']);
但如果我有5个过滤器,我需要5个连接到表product_specifications。 我可以添加joinWith一个包含所有连接的数组或添加5个连接到查询链吗? 对于一个类别,我的过滤器也是动态的,因此页面可以有5个或10个过滤器,我不能添加静态数量的joinWith('specs')。
提前致谢。
我同意不同的意见。
编辑:
我使用findBySql更改查询
$prodQuery = Product::findBySql('
SELECT `product`.*
FROM `product`
LEFT JOIN `productLang` ON `product`.`id` = `productLang`.`product_id`
LEFT JOIN `product_cat` ON `product`.`id` = `product_cat`.`product_id`
LEFT JOIN `page` ON `product_cat`.`page_id` = `page`.`id`
LEFT JOIN `page` `parent` ON `page`.`id_in` = `parent`.`id`'
.$joinString.
' WHERE ( '
.$whereString.
' AND (`language`=\''.$lang->url.'\')) GROUP BY `product`.`id` ');
我的数据提供者:
$dataProvider = new ActiveDataProvider([
'query' => $prodQuery,
'pagination' => [
'totalCount' => count($prodQuery->all()),
'pageSize' => $pageSize,
'route' => Yii::$app->getRequest()->getQueryParam('first_step'),
],
'sort' => [
'defaultOrder' => $orderArr,
],
]);
现在我的问题是分页和排序。在我的测试网站上我有4个产品,当我设置$ pageSize = 1;时,我有4页的分页,但在每个页面我都有4个产品。
我的错误在哪里?
答案 0 :(得分:0)
可能你可以使用andFilterWhere(如果值为null,则不添加codntion,否则添加和Where)
$prodQuery = Product::find()->joinWith('translation')->joinWith('cats')->where($whereString)->groupBy(['id']);
$prodQuery->andFilterWhere(['attribute1' => $value1])
->andFilterWhere(['attribute2' => $value2])
->andFilterWhere(['attribute3' => $value3])
->andFilterWhere(['attribute4' => $value4])
->andFilterWhere(['attribute5' => $value5])