Фильтрация результатов MySQL с использованием полиморфизма

У меня есть настройка метода в моем классе «отчетности», который извлекает результаты на основе ввода даты, например:

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"));

}

}

Это будет работать нормально, но есть ли менее уродливый способ / есть ли предпочтительный метод для этого?

0

Решение

Вы можете передать ваши данные в виде массива строк:

$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 );
}

То же самое, но немного чище.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]