0

私のコントローラーにはコードのこの部分があります:

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

(ここで、「anno」は「年」を意味します-titolo =「title」およびeditore=「publisher」)。

このコードを単純化するにはどうすればよいですか?

また、ユーザーが2人の著者を検索できるようにする必要があります(したがって、... elseステートメントの場合はさらに追加します)。

4

1 に答える 1

-2

すべての条件で同じサブクエリがあるようです。

この方法で連結を使用して、コードを保存できます。

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

比較を変更することもできます。

if ($an==''&&$an2=='')

為に

if (!$an && !$an2)

ああ、そして...変数には実際の言葉を使用します。のような意味のない変数を作成するよりも、何が何であるかを理解する方が常に優れてい$aます。これにより、コードの将来の変更が容易になり、コーディングの間違いを防ぐことができます。

于 2013-02-11T15:42:45.083 に答える