或者哪里对Laravel 5.1

时间:2016-01-18 00:04:41

标签: php sql laravel

我有以下代码:

$results = \DB::table('pack')
            ->Join('users as u1', 'u1.id', '=', 'pack.userid')
            ->Join('skills as s1', 's1.packid', '=', 'pack.packid')
            ->where('u_status', '=', "0")
            ->where('pack.amount', '<', 100)
            ->where('pack.amount', '>', 10)                 
            ->where('pack_status', '=', "2")
            ->where('pack.title', 'LIKE', "%$text%")
            ->orWhere('pack.description', 'LIKE', "%$text%")
            ->orWhere('pack.skills', 'LIKE', "%$text%")
            ->orWhere('s1.name', 'LIKE', "%$text%")
            ->orderBy('packid', 'desc')
            ->orderBy('featured', 'desc')
            ->groupBy('packid')
            ->take(40)
            ->get();
return $results;

除了->where('amount', '<', 100)->where('amount', '>', 10)之外,一切正常。

它不排除其中任何一个,并显示高于和低于我设定的数量的金额。如果我删除orWhere()它可以正常工作。

我正确使用orWhere()where()吗?

2 个答案:

答案 0 :(得分:3)

问题在于,您已将OR和AND组合在一起,而无需对其进行正确分组。考虑以下条件:

$bool1 = false && false || true; // =true
$bool2 = false && (false || true); // =false

因此,为了使其正常工作,您需要正确分组您的条件。您可以通过将闭包传递给where()orWhere()方法来对条件进行分组。我猜你想把$text条件组合在一起,所以你的代码看起来像:

$results = \DB::table('pack')
    ->join('users as u1', 'u1.id', '=', 'pack.userid')
    ->join('skills as s1', 's1.packid', '=', 'pack.packid')
    ->where('u_status', '=', "0")
    ->where('pack.amount', '<', 100)
    ->where('pack.amount', '>', 10)                 
    ->where('pack_status', '=', "2")
    ->where(function($query) use ($text) {
        $query->where('pack.title', 'LIKE', "%$text%")
            ->orWhere('pack.description', 'LIKE', "%$text%")
            ->orWhere('pack.skills', 'LIKE', "%$text%")
            ->orWhere('s1.name', 'LIKE', "%$text%");
    })
    ->orderBy('packid', 'desc')
    ->orderBy('featured', 'desc')
    ->groupBy('packid')
    ->take(40)
    ->get();

return $results;

答案 1 :(得分:0)

如果您的数据库行与orWhere中的任何一行匹配,它将显示该行。在你的代码中你有

->orWhere('pack.description', 'LIKE', "%$text%")
->orWhere('pack.skills', 'LIKE', "%$text%")
->orWhere('s1.name', 'LIKE', "%$text%")

如果您对其中任何一行进行匹配,则会忽略其他whereorWhere