PHP初学者在这里。寻找更高效的代码。
我有一个名为Brands
的模型,我正在尝试在我的视图中按字母顺序提取、排序和显示值。
例如:
以字母 A 开头的品牌名称
- 品牌1
- 品牌2.....等。
以字母 K 开头的品牌名称
- 品牌1
- 品牌2.....等。
我可以通过以下代码执行相同的操作:
$brandsTable = TableRegistry::get('Brands');
$brandA = $brandsTable->find('all')->where([
'deleted =' => 0
])-> andWhere(['brand_name_eng LIKE :key'
])->bind(':key', 'A%'
)-> orWhere(['brand_name_eng LIKE :key'
])->bind(':key', 'a%');
$brandK = $brandsTable->find('all')->where([
'deleted =' => 0
])-> andWhere(['brand_name_eng LIKE :key'
])->bind(':key', 'K%'
)-> orWhere(['brand_name_eng LIKE :key'
])->bind(':key', 'k%');
$brandS = $brandsTable->find('all')->where([
'deleted =' => 0
])-> andWhere(['brand_name_eng LIKE :key'
])->bind(':key', 'S%'
)-> orWhere(['brand_name_eng LIKE :key'
])->bind(':key', 's%');
$brandT = $brandsTable->find('all')->where([
'deleted =' => 0
])-> andWhere(['brand_name_eng LIKE :key'
])->bind(':key', 'T%'
)-> orWhere(['brand_name_eng LIKE :key'
])->bind(':key', 't%');
$brandN = $brandsTable->find('all')->where([
'deleted =' => 0
])-> andWhere(['brand_name_eng LIKE :key'
])->bind(':key', 'N%'
)-> orWhere(['brand_name_eng LIKE :key'
])->bind(':key', 'n%');
$brandH = $brandsTable->find('all')->where([
'deleted =' => 0
])-> andWhere(['brand_name_eng LIKE :key'
])->bind(':key', 'H%'
)-> orWhere(['brand_name_eng LIKE :key'
])->bind(':key', 'h%');
$brandM = $brandsTable->find('all')->where([
'deleted =' => 0
])-> andWhere(['brand_name_eng LIKE :key'
])->bind(':key', 'M%'
)-> orWhere(['brand_name_eng LIKE :key'
])->bind(':key', 'm%');
$brandY = $brandsTable->find('all')->where([
'deleted =' => 0
])-> andWhere(['brand_name_eng LIKE :key'
])->bind(':key', 'Y%'
)-> orWhere(['brand_name_eng LIKE :key'
])->bind(':key', 'y%');
$brandR = $brandsTable->find('all')->where([
'deleted =' => 0
])-> andWhere(['brand_name_eng LIKE :key'
])->bind(':key', 'R%'
)-> orWhere(['brand_name_eng LIKE :key'
])->bind(':key', 'r%');
$brandW = $brandsTable->find('all')->where([
'deleted =' => 0
])-> andWhere(['brand_name_eng LIKE :key'
])->bind(':key', 'W%'
)-> orWhere(['brand_name_eng LIKE :key'
])->bind(':key', 'w%');
$this->set('brandsA', $brandA);
$this->set('brandsK', $brandK);
$this->set('brandsS', $brandS);
$this->set('brandsT', $brandT);
$this->set('brandsN', $brandN);
$this->set('brandsH', $brandH);
$this->set('brandsM', $brandM);
$this->set('brandsY', $brandY);
$this->set('brandsR', $brandR);
$this->set('brandsW', $brandW);
我相信这不是多次调用模型/执行查询的最有效方法。尝试寻找有效的解决方案(哈希:提取/排序等)但无法获得适当的输出。感谢您的帮助。谢谢!
注意:已删除标志用于逻辑删除。
更新:在 ThinTank 和 ndm 评论之后很抱歉没有提到这一点,因为它是一个日本网站,我正在寻找区分大小写的品牌名称,从
[ A,E,I,O,U
],[ K ],[ S ],[ T ],[ N ],[ H ],[ M ],[ Y ],[ R ],[ W ]分别。例 : 我有以下品牌
阿迪达斯、艾里森、爱多克斯、锐步、天梭等。
输出应为:以ア开头的品牌名称:阿迪达斯佳 佳埃多克斯
以 ラ [R] 开头的品牌名称:锐 步
以タ[T]开头的品牌名称:天梭...等等,
这里有一种方法可以分解它:
$listBrandsLetter = array('A', 'K', 'S', 'T', 'N', 'H', 'M', 'Y', 'R', 'W');
$brandsTable = TableRegistry::get('Brands');
foreach($listBrandsLetter as $letter)
{
$currentBrand = $brandsTable->find('all')->where([
'deleted =' => 0
])-> andWhere(['brand_name_eng LIKE :key'
])->bind(':key', $letter.'%'
)-> orWhere(['brand_name_eng LIKE :key'
])->bind(':key', strtolower($letter).'%');
$this->set('brands'.$letter, $currentBrand);
}
如果您的目标是减少由于性能问题而导致的查询数量,请通知它。如果性能没问题,只需分解就足够了