337 lines
13 KiB
JavaScript
337 lines
13 KiB
JavaScript
$(document).ready(function()
|
|
{
|
|
var sql = {};
|
|
sql.tables = [];
|
|
sql.from = '';
|
|
sql.fields = '';
|
|
sql.condition = 'WHERE 1=1';
|
|
sql.orderBy = '';
|
|
sql.groupBy = '';
|
|
sql.limit = '';
|
|
|
|
$(document).on('click', '.icon-plus', function()
|
|
{
|
|
var that = $(this);
|
|
var newJoin = that.closest('div.form-box').clone();
|
|
newJoin.find('select').val('');
|
|
newJoin.find('input').val('');
|
|
that.closest('div.form-box').after(newJoin);
|
|
that.closest('div.form-box').next().find('div.chosen-container').remove();
|
|
that.closest('div.form-box').next().find('select:not(.nochosen)').each(function(){$(this).chosen()});
|
|
|
|
if(newJoin.find('.form-group').hasClass('slave-field-row'))
|
|
{
|
|
newJoin.find('.form-group.slave-field-row').addClass('hidden');
|
|
newJoin.find('.form-group.slave-field-row .decimal-box').addClass('hidden');
|
|
newJoin.find('.form-group.slave-field-row .decimal-box select').val(0);
|
|
}
|
|
|
|
/* 如果是条件设置里的加减行,每次加减完需要重新生成下条件。*/
|
|
if($(this).closest('div.form-box').find('select[name^="andOr"]').size > 0)
|
|
{
|
|
$('select[name^="andOr"]').change();
|
|
}
|
|
});
|
|
|
|
$(document).on('change', 'select[name^="mainTable"], select[name^="slaveTable"]', function()
|
|
{
|
|
sql.tables = [];
|
|
sql.tables.push($('#mainTable').val());
|
|
$('select[name^="slaveTable"]').each(function()
|
|
{
|
|
var table = $(this).val();
|
|
sql.tables.push(table);
|
|
});
|
|
|
|
updateTableSelect('firstTable', sql.tables);
|
|
updateTableSelect('secondTable', sql.tables);
|
|
updateTableSelect('queryTable', sql.tables);
|
|
updateTableSelect('conditionTable', sql.tables);
|
|
updateTableSelect('orderTable', sql.tables);
|
|
updateTableSelect('groupTable', sql.tables);
|
|
});
|
|
|
|
$(document).on('click', '.icon-close', function()
|
|
{
|
|
if($(this).closest('div.form-box').parent().find('.icon-close').size() > 1) $(this).closest('div.form-box').remove();
|
|
});
|
|
|
|
$(document).on('change', 'select[name^="firstTable"]', function()
|
|
{
|
|
updateFieldSelect($(this), 'firstField');
|
|
});
|
|
$(document).on('change', 'select[name^="secondTable"]', function()
|
|
{
|
|
updateFieldSelect($(this), 'secondField');
|
|
});
|
|
$(document).on('change', 'select[name^="queryTable"]', function()
|
|
{
|
|
updateFieldSelect($(this), 'queryField', 'yes');
|
|
});
|
|
$(document).on('change', 'select[name^="conditionTable"]', function()
|
|
{
|
|
updateFieldSelect($(this), 'conditionField');
|
|
});
|
|
$(document).on('change', 'select[name^="orderTable"]', function()
|
|
{
|
|
updateFieldSelect($(this), 'orderField');
|
|
});
|
|
$(document).on('change', 'select[name^="groupTable"]', function()
|
|
{
|
|
updateFieldSelect($(this), 'groupField');
|
|
});
|
|
|
|
$(document).on('change', '#tableBox select', function()
|
|
{
|
|
if(!$('#mainTable').val()) return false;
|
|
|
|
sql.from = "FROM " + '`' + $('#mainTable').val() + '`' + "\n";
|
|
$('#tableBox select[name^="secondField"]').each(function()
|
|
{
|
|
var secondField = $(this).val();
|
|
var firstField = $(this).closest('.input-group').find('select[name^="firstField"]').val();
|
|
|
|
var slaveTable = $(this).closest('.form-group').find('select[name^="slaveTable"]').val();
|
|
var firstTable = $(this).closest('.input-group').find('select[name^="firstTable"]').val();
|
|
var secondTable = $(this).closest('.input-group').find('select[name^="secondTable"]').val();
|
|
|
|
if(!(firstField && secondField)) return true;
|
|
|
|
sql.from += "LEFT JOIN `" + slaveTable + "` ON `" + firstTable + '`.`' + firstField + '` = `' + secondTable + '`.`' + secondField + '`' + "\n";
|
|
});
|
|
|
|
buildSQL(sql);
|
|
});
|
|
|
|
$(document).on('change', '#fieldBox select, #fieldBox input', function()
|
|
{
|
|
sql.fields = '';
|
|
$('#fieldBox .main-field-row select[name^="queryField"]').each(function()
|
|
{
|
|
$fieldRow = $(this).closest('.input-group');
|
|
$nextFieldRow = $(this).closest('.main-field-row.form-group').next();
|
|
|
|
var computeOperate = $fieldRow.find('select[name^="computeOperate"]').val();
|
|
if(computeOperate)
|
|
{
|
|
$fieldRow.find('input[name^="aliasName"]').val('');//如果是数学运算的话,将别名清空,否则会有错。
|
|
$nextFieldRow.removeClass('hidden');
|
|
if(computeOperate == '/')
|
|
{
|
|
$nextFieldRow.find('.decimal-box').removeClass('hidden');
|
|
}
|
|
else
|
|
{
|
|
$nextFieldRow.find('.decimal-box').addClass('hidden');
|
|
}
|
|
}
|
|
else
|
|
{
|
|
$nextFieldRow.addClass('hidden');
|
|
}
|
|
|
|
var queryTable = $fieldRow.find('select[name^="queryTable"]').val();
|
|
var queryField = $fieldRow.find('select[name^="queryField"]').val();
|
|
var funcOperate = $fieldRow.find('select[name^="funcOperate"]').val();
|
|
var aliasName = $fieldRow.find('input[name^="aliasName"]').val();
|
|
|
|
if(!queryField) return true;
|
|
if(sql.fields != '') sql.fields += ',';
|
|
|
|
queryField = '`' + queryField + '`';
|
|
queryTable = '`' + queryTable + '`';
|
|
|
|
var querySql = '';
|
|
querySql = queryTable + '.' + queryField;
|
|
if(funcOperate && queryField == "`*`") querySql = '"' + querySql + '"';
|
|
if(funcOperate) querySql = funcOperate + '(' + querySql + ')';
|
|
if(aliasName != '') querySql += ' AS ' + aliasName;
|
|
|
|
if(computeOperate)
|
|
{
|
|
var slaveQueryTable = $nextFieldRow.find('select[name^="queryTable"]').val();
|
|
var slaveQueryField = $nextFieldRow.find('select[name^="queryField"]').val();
|
|
var slaveFuncOperate = $nextFieldRow.find('select[name^="funcOperate"]').val();
|
|
var slaveComputeOperate = $nextFieldRow.find('select[name^="computeOperate"]').val();
|
|
var slaveAliasName = $nextFieldRow.find('input[name^="aliasName"]').val();
|
|
|
|
slaveQueryField = '`' + slaveQueryField + '`';
|
|
slaveQueryTable = '`' + slaveQueryTable + '`';
|
|
|
|
var slaveQuerySql = '';
|
|
slaveQuerySql = slaveQueryTable + '.' + slaveQueryField;
|
|
if(slaveFuncOperate && slaveQueryField == "`*`") slaveQuerySql = '"' + slaveQuerySql + '"';
|
|
if(slaveFuncOperate) slaveQuerySql = slaveFuncOperate + '(' + slaveQuerySql + ')';
|
|
|
|
querySql = '(' + querySql + computeOperate + slaveQuerySql + ')';
|
|
|
|
if(computeOperate == '/')
|
|
{
|
|
var decimal = $nextFieldRow.find('select[name^="decimal"]').val();
|
|
querySql = 'round(' + querySql + ',' + decimal + ')';
|
|
}
|
|
|
|
if(slaveAliasName) querySql += ' AS ' + slaveAliasName;
|
|
}
|
|
|
|
sql.fields += querySql;
|
|
|
|
});
|
|
|
|
buildSQL(sql);
|
|
});
|
|
|
|
$(document).on('change', '#conditionBox select, #conditionBox input', function()
|
|
{
|
|
sql.condition = 'WHERE 1=1';
|
|
$('#conditionBox select[name^="andOr"]').each(function()
|
|
{
|
|
var firstOperate = $(this).closest('.input-group').find('input[name^="firstOperate"]').val();
|
|
var secondOperate = $(this).closest('.input-group').find('input[name^="secondOperate"]').val();
|
|
|
|
var conditionTable = $(this).closest('.input-group').find('select[name^="conditionTable"]').val();
|
|
var conditionField = $(this).closest('.input-group').find('select[name^="conditionField"]').val();
|
|
var conditionOperate = $(this).closest('.input-group').find('select[name^="conditionOperate"]').val();
|
|
var conditionValue = $(this).closest('.input-group').find('input[name^="conditionValue"]').val();
|
|
var andOr = $(this).closest('.input-group').find('select[name^="andOr"]').val();
|
|
|
|
if(!conditionField) return true;
|
|
|
|
conditionTable = '`' + conditionTable + '`';
|
|
conditionField = '`' + conditionField + '`';
|
|
if(conditionValue.indexOf('$') == -1) conditionValue = "'" + conditionValue + "'";
|
|
|
|
if($(this).closest('div.form-box').next().find('select[name^="andOr"]').size() == 0) andOr = '';
|
|
|
|
if(sql.condition == 'WHERE 1=1') sql.condition += "\n" + 'AND ';
|
|
|
|
sql.condition += firstOperate + conditionTable + '.' + conditionField + ' ' + conditionOperate + ' ' + conditionValue + secondOperate + "\n" + andOr + ' ';
|
|
});
|
|
|
|
buildSQL(sql);
|
|
});
|
|
|
|
$(document).on('change', '#orderByBox select', function()
|
|
{
|
|
sql.orderBy = '';
|
|
$('#orderByBox select[name^="orderField"]').each(function()
|
|
{
|
|
var orderTable = $(this).closest('.input-group').find('select[name^="orderTable"]').val();
|
|
|
|
var orderField = $(this).closest('.input-group').find('select[name^="orderField"]').val();
|
|
var orderRule = $(this).closest('.input-group').find('select[name^="orderRule"]').val();
|
|
|
|
if(!orderField) return true;
|
|
|
|
if(sql.orderBy != '') sql.orderBy += ',';
|
|
if(sql.orderBy == '') sql.orderBy = 'ORDER BY ';
|
|
|
|
var aliasName = getFieldAliasName(orderTable, orderField);
|
|
if(aliasName != '')
|
|
{
|
|
sql.orderBy += aliasName + ' ' + orderRule;
|
|
}
|
|
else
|
|
{
|
|
orderField = '`' + orderField + '`';
|
|
orderTable = '`' + orderTable + '`';
|
|
sql.orderBy += orderTable + '.' + orderField + ' ' + orderRule;
|
|
}
|
|
});
|
|
|
|
buildSQL(sql);
|
|
});
|
|
|
|
$(document).on('change', '#groupAndLimtBox select, #groupAndLimtBox input', function()
|
|
{
|
|
sql.groupBy = '';
|
|
sql.limit = '';
|
|
|
|
var groupTable = $('#groupTable').val();
|
|
var groupField = $('#groupField').val();
|
|
var limit = $('#limit').val();
|
|
|
|
if(groupField != '')
|
|
{
|
|
var aliasName = getFieldAliasName(groupTable, groupField);
|
|
|
|
if(aliasName != '')
|
|
{
|
|
sql.groupBy = 'GROUP BY ' + aliasName;
|
|
}
|
|
else
|
|
{
|
|
groupTable = '`' + groupTable + '`';
|
|
groupField = '`' + groupField + '`';
|
|
sql.groupBy = 'GROUP BY ' + groupTable + '.' + groupField;
|
|
}
|
|
}
|
|
if(limit != '')
|
|
{
|
|
sql.limit = 'LIMIT ' + limit;
|
|
}
|
|
|
|
buildSQL(sql);
|
|
});
|
|
});
|
|
|
|
function updateTableSelect(type, tables)
|
|
{
|
|
/* 更新 condition table */
|
|
$.post(createLink('sqlbuilder', 'ajaxGetTables'), {'type': type, 'tables': tables.join(',')}, function(data)
|
|
{
|
|
$('select[name^="' + type + '"]').each(function()
|
|
{
|
|
var that = $(this);
|
|
var tableValue = that.val();
|
|
var tableDiv = that.closest('div');
|
|
tableDiv.html(data);
|
|
tableDiv.find('select').val(tableValue);
|
|
tableDiv.find('select').chosen();
|
|
});
|
|
});
|
|
}
|
|
|
|
function getFieldAliasName(table, field)
|
|
{
|
|
if(table == '' || field == '') return '';
|
|
|
|
var name = '';
|
|
$('#fieldBox select[name^="queryField"]').each(function()
|
|
{
|
|
var queryTable = $(this).closest('.input-group').find('select[name^="queryTable"]').val();
|
|
var queryField = $(this).closest('.input-group').find('select[name^="queryField"]').val();
|
|
var aliasName = $(this).closest('.form-group').find('input[name^="aliasName"]').val();
|
|
|
|
if(queryTable == table && queryField == field && aliasName != '')
|
|
{
|
|
name = aliasName;
|
|
return false;
|
|
}
|
|
});
|
|
|
|
return name;
|
|
}
|
|
|
|
function updateFieldSelect(that, type, includeAll = 'no')
|
|
{
|
|
var table = that.val();
|
|
var link = createLink('sqlbuilder', 'ajaxGetTableFields', "table=" + table + "&type=" + type + "&includeAll=" + includeAll);
|
|
that.closest('.input-group').find('select[name^="' + type + '"]').closest('div').load(link, function()
|
|
{
|
|
that.closest('.input-group').find('select[name^="' + type + '"]').chosen();
|
|
});
|
|
}
|
|
|
|
function buildSQL(sql)
|
|
{
|
|
$('#sql').val("SELECT " + sql.fields + "\n" + sql.from + ' ' + sql.condition + ' ' + sql.orderBy + ' ' + sql.groupBy + ' ' + sql.limit);
|
|
}
|
|
|
|
function useSQL()
|
|
{
|
|
var sql = $('#sql').val();
|
|
$("#sql", parent.document.body).val(sql);
|
|
$.closeModal();
|
|
}
|