Laravel查询构建器原始AND语句

时间:2016-04-30 21:49:03

标签: php mysql laravel

我需要在Laravel中运行原始SQL查询部分。

原始SQL基本上看起来像这样:

AND (forretningsadresse_fylke = 'HEDMARK' 
    AND (forretningsadresse_kommune = 'HAMAR') 
    OR (forretningsadresse_kommune = 'ELVERUM')
) 
OR (forretningsadresse_fylke = 'HORDALAND' 
    AND (forretningsadresse_kommune = 'BERGEN')
) 

我尝试使用:

$result = Company::where(function($a) use($input, $sql) {

        // Name or keywords LIKE string
        $a -> where('navn', 'LIKE', '%'. $input['query_string'] .'%');
        $a -> where('keywords', 'LIKE', '%'. $input['query_string'] .'%');
        if (!empty($sql)) {
            $a -> where(DB::statement($sql));
        }

    });

    $result = $result -> take($input['limit'])       // Take $limit
                      -> offset($input['offset'])    // Offset by $offset
                      -> orderBy('rank', 'DESC')     // Sponsors first
                      -> get();  

但它不起作用。请参阅下面的错误。 我怎么能让这个工作?提前谢谢!

Connection.php第673行中的QueryException:SQLSTATE [42000]:语法错误或访问冲突:1064 SQL语法中有错误;检查与您的MariaDB服务器版本对应的手册,以便在第1行的'AND(forretningsadresse_fylke ='AKERSHUS')附近使用正确的语法(SQL:AND(forretningsadresse_fylke ='AKERSHUS'))

编辑:该表有100万行,我使用此方法创建原始查询:http://i.imgur.com/Q5SRP58.png

2 个答案:

答案 0 :(得分:1)

您的代码存在两个问题:

  1. 您正在使用DB::statement,您应该使用DB::rawDB::statement将执行您作为参数传递的字符串,而这不是您需要的。您需要传递一个原始语句以包含在查询构建器中。
  2. 假设您发布的原始块是$sql参数,那么您需要删除起始AND,否则查询将以.... and AND (结束,这将引发错误。
  3. 鉴于此,您需要将代码更新为:

    // Notice the removal of the `AND`
    $sql = "(forretningsadresse_fylke = 'HEDMARK' 
            AND (forretningsadresse_kommune = 'HAMAR') 
            OR (forretningsadresse_kommune = 'ELVERUM')
        ) 
        OR (forretningsadresse_fylke = 'HORDALAND' 
            AND (forretningsadresse_kommune = 'BERGEN')
        )";
    
    $result = Company::where(function($a) use($input, $sql) {
        // Name or keywords LIKE string
        $a->where('navn', 'LIKE', '%'. $input['query_string'] .'%');
        $a->where('keywords', 'LIKE', '%'. $input['query_string'] .'%');
        if (!empty($sql)) {
            // Using DB::raw instead of DB::statement
            $a->where(DB::raw($sql));
        }
    });
    

答案 1 :(得分:1)

尝试

$result = Company::where('navn', 'LIKE', '%'. $input['query_string'] .'%')
    ->where('keywords', 'LIKE', '%'. $input['query_string'] .'%')
    ->where(function($query){
        $query->where('forretningsadresse_fylke', '=', 'HEDMARK' )
              ->where('forretningsadresse_kommune', '=', 'HAMAR')
              ->orWhere('forretningsadresse_kommune','=', 'ELVERUM');
    })
    ->where(function($query){
        $query->orWhere('forretningsadresse_fylke','=', 'HORDALAND')
              ->where('forretningsadresse_kommune', '=', 'BERGEN');
   })
   ->take($input['limit'])       // Take $limit
   ->offset($input['offset'])    // Offset by $offset
   ->orderBy('rank', 'DESC')     // Sponsors first
   ->get();  

希望有所帮助