sql builder中的多个语句之间

时间:2014-02-07 22:36:18

标签: sql laravel-4 builder parentheses

我正在使用laravel 4 sql builder创建一个相当大的查询。它大致看起来像是从表中获取数据

其中(yada yada)和(yada,yada)之间或(yada,yada)之间的年龄(yad yada)之间的年龄。

但我想要的是这个。

其中(yada yada)和(yada,yada)之间或(yada,yada)之间的年龄)(yad yada)。(/ yad)。

一些代码:

    $query = Subject::grabBasic();// start writing query, which results to grab.
    $agelength  = sizeof($fromAgeValue);
    $count      = 0;
    $ageflag    = 0;
    foreach( array_combine($fromAgeValue, $toAgeValue) as   $from=>$to ){
        $count+=1;
        if($ageflag==0){
            if(($from!=null)&&($to!=null)){
                $query = Subject::addfromAgeToAge($query, $from, $to);
                $ageflag=1;                                                 
            }
        }else if(($from!=null)&&($to!=null)){
            $query = Subject::orfromAgeToAge($query, $from, $to);
        }
    }

...继续添加到$ query

主题代码:

static function addfromAgeToAge($query, $fromAge, $toAge){
    return $query->whereBetween('Age', array($fromAge, $toAge));
}

static function orfromAgeToAge($query, $fromAge, $toAge){
    return $query->orWhereBetween('Age', array($fromAge, $toAge));
}

那么,有没有办法编写addToAge构建器函数来接受fromage和toage值的数组并创建一个语句,当添加到查询的其余部分时,它将提供所需的结果。例如。 sql查询将在正确的位置放置括号。

我也想在没有原始查询的情况下这样做,我怀疑有一种方法可以做到这一点我只是找不到它。

谢谢,

1 个答案:

答案 0 :(得分:1)

我屈服并使用原始查询:(

这就是它的样子。

$agecounter = 0;// tells me how many from age to age pairs were filed out coorrectly.
    foreach( array_combine($fromAgeValue, $toAgeValue) as   $from=>$to ){
        if(($from!=null)&&($to!=null)){
            $agecounter+=1;
        }
    }
    $agelength  = sizeof($fromAgeValue);
    $ageflag    = 0;
    foreach( array_combine($fromAgeValue, $toAgeValue) as   $from=>$to ){
        if($ageflag==0){
            if(($from!=null)&&($to!=null)){
                $query = Subject::addfromAgeToAge($query, $from, $to, $agecounter);     // ages put in for loop when multiple are added.
                $ageflag=1;                                                 // add or's
                $agecounter -=1;
            }
        }else if(($from!=null)&&($to!=null)){
            $query = Subject::orfromAgeToAge($query, $from, $to, $agecounter);
            $agecounter -=1;
        }
    }

并在我的模型中:

static function addfromAgeToAge($query, $from, $to, $count){
    if($count>1){
        return $query->whereRaw('( Age between ? and  ?', array($from, $to));
    }
    return $query-> whereBetween('Age', array($from, $to));
}

static function orfromAgeToAge($query, $from, $to, $count){
    if($count==1){
            return $query->orWhereRaw(' Age between ? and  ?)', array($from, $to));
    }
    return $query->orWhereRaw(' Age between ? and  ?', array($from, $to));//('Age', array($fromAge, $toAge));
}

希望这有助于其他人将()置于查询构建器中。