Весь этот код, который вы вставили, написан на PHP, поэтому он вообще не использует среду DataTables для поиска, и я собираюсь предположить, что у вас включена обработка на стороне сервера.
Для выполнения отрицательного фильтра на стороне сервера с использованием SQL NOT LIKE
было бы хорошо, как вы пытались сделать, но весь ваш код положительного и отрицательного фильтров обрабатывается в одном цикле дайджеста.Я бы добавил еще $_GET
, например $_GET['sSearch_type']
, чтобы обрабатывать ваши негативные фильтры в совершенно отдельном цикле.До тех пор, пока вы можете воспроизводить запрос в PHP MyAdmin (или независимо от того, какой менеджер SQL вы используете), не будет никаких проблем при настройке запроса в отдельном цикле с использованием отдельного $_GET
для управления типом поиска.
Для тех из вас, кто хочет на самом деле , используйте DataTables для фильтрации и нуждаются в выражении отрицательного фильтра: @Nate правильно использовать выражение regex
, но реализация не являетсяt обсуждается.
Есть два API-способа, которыми я знаю, чтобы использовать регулярное выражение таким образом.fnFilter()
или search()
fnFilter()
устарели, вы все еще можете использовать его, но лучше использовать функцию search()
API, которая была написана для замены fnFilter()
.
Документы:
ПРИМЕР:
// case insensitive filter a column for all
// values that don't match 'closed'
column.search( '^(?!closed).*$', true, false, true ).draw();
ПРИМЕР ОСУЩЕСТВЛЕНИЯ:
/**
* This example creates a select box filter which
* appends to the thead cell of the 3rd column
* from the left (i.e. column at index 2). The values
* of the select <option></option> are generated
* automatically based on the column's real values
* except for the 2 top most filters. The first is "All"
* which passes and empty string to the regex filter,
* and the second top most filter is "All Open Projects"
* which triggers the negative regex filter to remove
* all rows where the column value is set to "Closed"
* or "closed"
*/
$(document).ready(function() {
$('#report-table').DataTable({
initComplete: function () {
this.api().columns().every( function () {
var column_index = this[0][0],
column = this,
not_closed = 'not_closed',
select = $('<select id="status_col_filter" style="margin-left:10px;"><option value="">All</option><option value="'+ not_closed +'">All Open Projects</option></select>');
if (column_index === 2) {
select
.appendTo( $(column.header()) )
.on( 'change', function () {
var val = $.fn.dataTable.util.escapeRegex( $(this).val() );
if (val === not_closed) {
// negative regex for all open status projects
column.search( '^(?!closed).*$', true, false, true ).draw();
} else {
// regular positive regex - filter by column value
column.search( val ? '^'+val+'$' : '', true, false ).draw();
}
});
column.data().unique().sort().each( function ( d, j ) {
select.append( '<option value="'+d+'">'+d+'</option>' )
});
}
});
}
});
});