gpt4 book ai didi

php - 如何在单个查询中获取拥有产品的嵌套类别?

转载 作者:行者123 更新时间:2023-11-29 18:33:15 26 4
gpt4 key购买 nike

我有这样的表格。

Categories (id[PK], name, parentid);
Product(prid[PK], product_name, product_price);
ProductCategories(id[PK], prid[FK], catid[FK]);

一种产品属于多个类别。

我有一个场景,我将从用户那里获取一个 catid,并且我必须获取属于该类别的产品。同时,我还必须获取该类别的子类别(如果有)并获取子类别的产品。获取类别及其子类别是一项简单的任务 - 通过自连接。

但我必须检查这些类别是否已标记产品。 (意味着如果该类别/子类别下没有标记产品,则忽略该类别)

例如

Automobile (0 products)
Two Wheelers (0 products)
Mopeds (2 products)
Bikes (5 products)
Sport Bikes (0 products)

Four Wheelers (0 products)
Convertible (0 products)
SUV (4 products)
TUV (2 products)

Tyres (0 products)

所以我想要这样的结果(这些类别/子类别没有我必须删除的产品)。

Automobile
Two Wheelers
Mopeds
Bikes
Four Wheelers
SUV
TUV

我通过循环类别来完成这件事。我可以在单个查询中完成此操作吗?

一些代码:

$rows = (new \yii\db\Query())
->select(["COUNT( * ) AS prodcount",'c1.parentid', "GROUP_CONCAT(c1.id, ':', c1.name) as catid"])
->from('category c1')
->join('inner join','category c2','c1.id=c2.id')
->where(['not in','c1.parentid','0'])
->andWhere(['!=','c1.parentid',1])
->andWhere(array('c1.status'=>1))
->andWhere(array('c2.status'=>1))
->groupBy('c1.parentid')
->orderBy('prodcount DESC')
->all();

$result=array();

foreach ($rows as $r)
{
$cats= explode(":",$r['catid']);

if( $this->hasProducts($cats[0]))
{
if($r['parentid']!=1)
{
$pnm= \backend\models\Category::find()->select('name')->where(['id'=>$r['parentid']])->one();
$result['parent']=$r['parentid'].":".$pnm['name'];
}
else{
$result['parent']=$r['parentid'].":".'Main';
}

$result['catid']=$r['catid'];
$this->cat[$result['parent']]=$result['catid'];
}
}

我在这里检查该类别是否至少有一个产品?

public function hasProducts($catid)
{
$hasProducts=false;
$allCats= array();
$allCats = $this->getAllChildren($catid);

if($allCats!== NULL && !empty($allCats) && sizeOf($allCats)>0)
{
$cats = implode(",",$allCats);
$prodcatquery = (new \yii\db\Query())
->from('product_categories pc')
->where("pc.catid in ($cats)");
$products= $prodcatquery->all();

if (sizeOf($products)>0)
{
$hasProducts=true;
}
}

return $hasProducts;
}

获取该类别的所有子类别

public function getAllChildren($catid)
{
$cats=$catid;
$allcats=array();
$currentcats=array();
array_push($allcats, $catid);
$intialquery = (new \yii\db\Query())
->select(['id'])
->from('category')
->where("parentid in ($cats)");
$catidreturned = $intialquery->all();

$i=0;
while(sizeOf($catidreturned ) > 0 && $i <=3 )
{

foreach ($catidreturned as $categoryid )
{
array_push( $allcats,$categoryid['id']);
array_push( $currentcats,$categoryid['id']);
}
$cats= implode(',', $currentcats);
$intialquery1 = (new \yii\db\Query())
->select(['id'])
->from('category')
->where("parentid in ($cats)");
$catidreturned = $intialquery1->all();
$currentcats=array();
$i++;
}

return $allcats;
}

问题:我通过循环类别来完成此操作。我可以在单个查询中完成此操作吗?

最佳答案

从类别 = 1 的类别或子类别中选择产品(从 id = 1 的 sub_categories 中选择子类别)

根据您的表格进行修改

关于php - 如何在单个查询中获取拥有产品的嵌套类别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45521092/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com