如何在cakePHP 1.2中组合查询代码

如何在cakePHP 1.2中组合查询代码,php,cakephp,optimization,cakephp-1.2,Php,Cakephp,Optimization,Cakephp 1.2,我的控制器中有这部分代码: if ((!empty($params))&&(isset($params['autore'])||isset($params['titolo'])||isset($params['editore'])||isset($params['anno']))) { $a = $params['autore']; if (strpos($a,' ')||strpos($a,',')) { $autore_diviso =

我的控制器中有这部分代码:

if ((!empty($params))&&(isset($params['autore'])||isset($params['titolo'])||isset($params['editore'])||isset($params['anno']))) {
        $a = $params['autore'];
    if (strpos($a,' ')||strpos($a,',')) {
        $autore_diviso = explode(" ", $a);
        $this->set('autore_diviso', $autore_diviso);
    }
    $t = $params['titolo'];
    $e = $params['editore'];
    $an = $params['anno'];
    $an2 = $params['anno2'];

    if ($an==''&&$an2=='')
            $conditions = array('AND' => array('autori LIKE' => "%$a%",
                'editore LIKE' => "%$e%",'titolo LIKE' => "%$t%"));                     
        else    
        {
            if ($an=='')
                      $conditions = array(array('AND' => array('autori LIKE' => "%$a%",
                      'editore LIKE' => "%$e%",'titolo LIKE' => "%$t%")),
                    'AND' => array('anno <=' => "$an2"));
            if ($an2=='')
                $conditions = array(array('AND' => array('autori LIKE' => "%$a%", 'editore LIKE' => "%$e%",'titolo LIKE' => "%$t%")),                   'AND' => array('anno >=' => "$an"));
            else
                $conditions = array('AND' => array(
                            'autori LIKE' => "%$a%", 'editore LIKE' => "%$e%",
                            'titolo LIKE' => "%$t%"),
                            'OR' => array('anno BETWEEN ? AND ?' => array($an,$an2)));
        }
        $u = $this->paginate('CdBiblio',$conditions);
            $this->set('query', $u);
    }
if(!empty($params))&&(isset($params['autore'])| | isset($params['titolo'])| | isset($params['editore'])| | isset($params['anno'])){
$a=$params['autore'];
if(strpos($a,,)| | strpos($a,,')){
$autore_diviso=爆炸(“,$a”);
$this->set('autore_diviso',$autore_diviso);
}
$t=$params['titolo'];
$e=$params['editore'];
$an=$params['anno'];
$an2=$params['anno2'];
如果($an=''&&$an2='')
$conditions=array('AND'=>array('autori LIKE'=>“%$a%”),
“编辑类”=>“%$e%”,“标题类”=>“%$t%”);
其他的
{
如果($an='')
$conditions=array(数组('AND'=>array('autori-LIKE'=>“%$a%”),
'编辑类'=>“%$e%”,'标题类'=>“%$t%”),
'和'=>数组('anno='=>“$an”);
其他的
$conditions=array('AND'=>array(
'autori LIKE'=>“%$a%”,'editore LIKE'=>“%$e%”,
'标题类似'=>“%$t%”,
'或'=>array('anno-BETWEEN?和?'=>array($an,$an2));
}
$u=$this->paginate('CdBiblio',$conditions);
$this->set('query',$u);
}
(其中“anno”表示“year”-titolo='title'和editore='publisher')。

如何简化此代码


此外,我还需要为用户提供搜索两位作者的可能性(因此我会添加更多if…else语句)。

似乎在所有条件下都有相同的子查询

可以通过以下方式使用串联来保存代码:

//common subquery
$conditions = array('AND' => array(
                        'autori LIKE' => "%$a%", 'editore LIKE' => "%$e%",
                        'titolo LIKE' => "%$t%"));

//for example...  
if(...){
    $conditions+=array('AND' => array('anno <=' => "$an2"));
}else{
    $conditions+=array('OR' => array('anno BETWEEN ? AND ?' => array($an,$an2)));
}

$u = $this->paginate('CdBiblio',$conditions);
为了


哦,还有。。。我会用实词来表示变量。理解什么是什么总是比创建没有意义的变量更好,比如
$a
。这使得以后修改代码和防止编码错误变得更容易。

我尝试过,但它说:SQL错误:1054:where子句中的未知列“ArrayArrayArray”,我想你有一些whoodoo技能让数组做他们不应该做的事情:)像什么?我没有在数组中使用数组,但我相信它也应该可以工作。我做的事情比较简单,但结构相同:
$conditions=array('Post.status\u id'=>$statusIds)
然后
$conditions=$conditions+array('Post.department\u id'=>$departmentIds)抱歉,但这不起作用:数组键是相同的,因此第二个
和'
将覆盖第一个。您必须使用
$conditions[]=array(…)
。(CakePHP可以读取嵌套数组。)您考虑过吗?这真的很好,为可读性格式化代码将是一个很好的开始
if ($an==''&&$an2=='')
if (!$an && !$an2)