У меня есть настройка метода в моем классе «отчетности», который извлекает результаты на основе ввода даты, например:
public function total_things_to_date() {
return mysqli_num_rows($this -> db -> blank_query(" SELECT `thing_id`
FROM `things`
WHERE `client_id` = '{$_SESSION['client_id']}'
AND `thatid` IN (" . $this -> db -> prepareInClause($this -> that_id_array) . ")"));
}
Я ищу идеи о том, как я мог бы добавить фильтр к этому запросу без необходимости переписывать метод … например, если я собирался фильтровать по department_id
и я должен был переписать метод, который я мог бы добавить AND
пункт:
public function total_things_to_date() {
return mysqli_num_rows($this -> db -> blank_query(" SELECT `thing_id`
FROM `things`
WHERE `client_id` = '{$_SESSION['client_id']}'
AND `thatid` IN (" . $this -> db -> prepareInClause($this -> that_id_array) . ")
AND `deptid` = '$deptid'"));
}
В качестве альтернативы, я мог бы проанализировать аргументы метода для фильтрации результатов:
public function total_things_to_date($where = NULL, $selector = NULL) {
if($where != NULL && $selector != NULL) {
return mysqli_num_rows($this -> db -> blank_query(" SELECT `thing_id`
FROM `things`
WHERE `client_id` = '{$_SESSION['client_id']}'
AND `thatid` IN (" . $this -> db -> prepareInClause($this -> that_id_array) . ")
AND `deptid` = '$deptid'"));
} else {
//some array checks etc.
$filterString = "";
for($i=0;$i<count($where); $i++) {
$filterString .= "AND `$where[$i]` = '$selector[$i]'";
}
return mysqli_num_rows($this -> db -> blank_query(" SELECT `thing_id`
FROM `things`
WHERE `client_id` = '{$_SESSION['client_id']}'
AND `thatid` IN (" . $this -> db -> prepareInClause($this -> that_id_array) . ")
$filterString"));
}
}
Это будет работать нормально, но есть ли менее уродливый способ / есть ли предпочтительный метод для этого?
Вы можете передать ваши данные в виде массива строк:
$conditions = array("`dept_id`=1","`some_id`=2");
public function total_things_to_date( $conditions )
{
$query = "SELECT `thing_id`
FROM `things`
WHERE `client_id` = '{$_SESSION['client_id']}'
AND `thatid` IN (" . $this -> db -> prepareInClause($this -> that_id_array) . ")";
$query .= implode( "AND", $conditions );
return mysqli_num_rows($this -> db -> blank_query( $query );
}
То же самое, но немного чище.
Других решений пока нет …