我需要在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
答案 0 :(得分:1)
您的代码存在两个问题:
DB::statement
,您应该使用DB::raw
。 DB::statement
将执行您作为参数传递的字符串,而这不是您需要的。您需要传递一个原始语句以包含在查询构建器中。$sql
参数,那么您需要删除起始AND
,否则查询将以.... and AND (
结束,这将引发错误。 鉴于此,您需要将代码更新为:
// 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();
希望有所帮助