Cakephp和ajax搜索

时间:2014-02-25 05:04:25

标签: jquery ajax cakephp-2.0

我有专栏keyworddate filterstatus现在,  我希望在发送数据字符串中的所有变量时使用ajax,搜索其工作正常,但是当我发送关键字和其他字段为空时它不起作用?我想知道当某个字段值传递为空时如何设置WHERE clause

Data String : keyword=assignment&date=created&fromdate=&todate=

在cakephp控制器中传递字符串,但因为日期归档空查询无效。

的Ajax

$('#keyword, #fromdate, #todate, input[name="status"]').on('change',function(){

    var status = "";
    if($('input[name="status"]').is(':checked')) {
        var val = $('input[name="status"]:checked').val();  
        status = '&status='+val;
    }

    var keyword = $('#keyword').val();
    var date = $('#date').val();

    var fromdate = $('#fromdate').val();
    var todate = $('#todate').val();

    var data = 'keyword='+keyword+'&date='+date+'&fromdate='+fromdate+'&todate='+todate+status;
    console.log(data);

    $.ajax({
        url:HOST+'assignments/assignment_search',
        type:'POST',
        data:data,
        beforeSend : function() {
            $('#all_assignment').html('<div id="loading_div"><img src="/img/loading.gif"/></div>');
        },
        success: function(data){
            if(data != "")
            {
                $('#all_assignment').html(data);
            }
        }
    });
});

控制器:

                $where = "WHERE ";

                if(isset($this->data['status'])) {
                    $status_val = $this->data['status'];
                    $where .= "Assignment.status = $status_val";
                }

                if(!empty($keyword)) {
                    $where .= "Assignment.title LIKE '%$keyword%'";
                }

                if($fromdate != "" && $todate != "") {
                     $where .= " AND DATE_FORMAT(Assignment.created, '%Y-%m-%d') BETWEEN $fromdate AND $todate";
                }

                $assignment = $this->Assignment->query("
                    SELECT * FROM assignments as Assignment
                    $where
                ");

我想在where子句中添加变量,如果它不为空。请帮我查询一下。

2 个答案:

答案 0 :(得分:0)

在放置“AND”关键字时,您需要更加小心。 在我看来,在某些情况下,您生成的查询将缺少一些“AND”字。

答案 1 :(得分:0)

你应该使用find方法更容易,使用find方法你可以更好地定义你的条件:

$conditions = array();
if(isset($this->data['status'])) {
   $conditions['Assignment.status'] = $this->data['status'];
}
if(!empty($keyword)) {
   $conditions['Assignment.title like'] = '%'.$keyword.'%';
}
if($fromdate != "" && $todate != "") {
    $conditions['Assignment.created between ? and ?'] = array($fromdate, $todate);
}

当你在find()中使用它们时,它们将被自动放入一个带有'AND'运算符的查询中,现在你的CakePHP find()应该是这样的:

$assignment = $this->Assignment->find('all',array('conditions'=>$conditions));

我没有测试过该代码以检查它是否没有错误,但是一旦你根据自己的需要调整它就可以正常工作。