为什么laravel查询无法获取正确的数据?

时间:2019-03-01 19:02:15

标签: laravel laravel-5 eloquent

我正在尝试获取模式为easyadvanced的记录,但每次仅返回easy条记录。即那些记录的模式设置为easy。

查询字符串:mywebsite.com/game?easy=easy&advanced=advanced

public function index(Request $request) {

    if($request->has('easy') {
        return GameMode::where('mode', $request->easy)->get();
    }

    if($request->has('advanced') {
        return GameMode::where('mode', $request->advanced)->get();
    }

    return GameMode::all();
}

5 个答案:

答案 0 :(得分:4)

如果设置了查询,则立即返回模式设置为easy的查询。您可以做的是根据您的请求构建查询,如下所示:

object.Equals(object)

答案 1 :(得分:4)

这意味着您必须创建一个空查询,然后根据输入内容进行构建:

public function index(Request $request) {

    $query = GameMode::query();
    if($request->has('easy') {
        $query->where('mode', $request->easy);
    }

    if($request->has('advanced') {
        $query->orWhere('mode', $request->advanced);
    }

    return $query->get();
}

有关更多信息,请参考this article

答案 2 :(得分:4)

尝试在此处使用when方法

return GameMode::when($request->easy,function($q,$request) {
             return $q->where('mode', $request->easy);
       })->when($request->advanced,function($q,$request) {
             return $q->orWhere('mode', $request->advanced);
       })->get();

答案 3 :(得分:3)

解决方案1:

public function index(Request $request) {
    if($request->only('easy','advanced')) {
        return GameMode::whereIn('mode', $request->only('easy','advanced'))->get();
    }

    return GameMode::all();
}

解决方案2:

public function index(Request $request) {

    if($request->has('easy') && $request->has('advanced')) {
        return GameMode::whereIn('mode', [$request->easy, $request->advanced])->get();
    }

    if($request->has('mode')) {
        return GameMode::where('mode', $request->easy)->get();
    }

    if($request->has('advanced')) {
        return GameMode::where('mode', $request->advanced)->get();
    }

    return GameMode::all();
}

答案 4 :(得分:2)

在这些情况下,我尝试使用scope*函数
GameMode.php模型

...
public function scopeEasyMode($q, $easy) 
{
    if (!empty($easy)) { return $q->orWhere('mode', $easy); }
}

public function scopeAdvanceMode($q, $adv) 
{
    if (!empty($adv)) { return $q->orWhere('mode', $adv); }
}
...


在您的控制器GameModeController.php

...
$results = GameMode::easyMode($request->easy)->advanceMode($request->advance)->get();
...

这将过滤出您的所需模式所有
更新:与其将值目录传递给那些scope*方法,不如您最好先过滤/验证值,这样不容易出错。