我正在研究要避免sql查询重复的SQL查询代码。
下面是sql查询代码:
switch ($y) {
case 'l.text':
$query->order('numeric_text ' . (strtolower($x) == 'DESC' ? 'DESC' : 'ASC') .
', ' . $y . ' ' . (strtolower($x) == 'DESC' ? 'DESC' : 'ASC'));
break;
}
在上面的SQL查询代码strtolower($x) == 'DESC' ? 'DESC' : 'ASC'
中有两个地方使用。我正在考虑在上面放一个杂物。
这是我尝试过的:
$sortOrder = (strtolower($x) == 'DESC' ? 'DESC' : 'ASC');
switch ($y) {
case 'l.text':
$query->order('numeric_text ' . $sortOrder . ', ' . $y . ' ' . $sortOrder);
break;
}
问题陈述:
我想知道是否还有其他更好的方法,我们可以避免sql查询重复。
答案 0 :(得分:0)
也许您可以在模型或帮助程序库中使用函数来为您完成这项工作,并在您的项目中使用它,那么干掉代码是个好主意。
// Helper
function sort_statment($fields, $sort_order) {
$sort_statment = '';
foreach($fields as $field){
$sort_statment += $field . ' ' . $sort_order
}
return $sort_statment;
}
// Model
$sort_fields ['numeric_text', 'other_field', $y ....];
switch ($y) {
case 'l.text':
$query->order(sort_statment($sort_fields, $sort_order);
break;
}
答案 1 :(得分:0)
就像尼克在评论中提到的那样,您不能降低字符串并使它等于'DESC'或'ASC',假设它只是一个错字,您可以覆盖变量而不是声明一个新变量:>
if(strtoupper($x) != 'DESC') $x = 'ASC';
switch ($y) {
case 'l.text':
$query->order('numeric_text ' . strtoupper($x) . ', ' . $y . ' ' . strtoupper($x));
break;
}
了解$ x可以采用的值也将有帮助。
答案 2 :(得分:0)
如果要最大程度地减少代码重复,可以将代码分为三个部分:确定排序顺序,确定列名和进行查询。例如:
// determination of sort order
$sortOrder = (strtoupper($x) == 'DESC' ? 'DESC' : 'ASC');
// determination of column name
switch ($y) {
case 'l.text':
$column = 'numeric_text';
break;
}
// making of a query
$query->order($column . $sortOrder . ', ' . $y . ' ' . $sortOrder);
当然,您可以使用代码的那些部分来创建函数或方法(如果使用OOP)。例如:
/**
* determination of sort order
*/
function getSortOrder($x)
{
return strtoupper($x) == 'DESC' ? 'DESC' : 'ASC';
}
/**
* determination of column name
*/
function getColumn($y)
{
switch ($y) {
case 'l.text':
return 'numeric_text';
break;
}
}
/**
* making of a query
*/
function addOrder($query, $x, $y)
{
$sortOrder = getSortOrder($x);
$column = getColumn(y);
$query->order($column . $sortOrder . ', ' . $y . ' ' . $sortOrder);
}
此外,如果您有许多列,则可以使用映射而不是case
语句。这将使您的代码更易于阅读。例如:
// determination of column name
$map = [
'l.text' => 'numeric_text'
];
$column = key_exists($y, $map) ? $map[$y] : 'default_column'
答案 3 :(得分:0)
为什么不使用三元运算符的简写
<?php
$sortOrder = $sortOrder ?: 'ASC';
switch ($y) {
case 'l.text':
$query->order("numeric_text {$sortOrder},{$y} {$sortOrder}");
break;
}