Laravel 5变量构造查询字符串Eloquent

时间:2018-01-03 15:10:41

标签: php laravel-5 laravel-5.3

我正在尝试将JSON发送到我的Laravel服务器并返回Eloquent查询字符串的结果,该字符串本身是根据正在发送的JSON构造的。我计划将多个where / whereHas语句链接在一起以实现此目的,但到目前为止,我仍然坚持第一个并且想知道这是否可行。

代码:

if(isset($settings->new)){
$assetQuery = "where('created_at','>',".Carbon::now()->subMonths(1).")";
}
if(isset($settings->long)){
$assetQuery = "where('lengthD','Long')";
}
if(isset($settings->short)){
$assetQuery = "where('lengthD','Short')";
}
if(!isset($settings->new)&&!isset($settings->long)&&!isset($settings->short)){
$assetQuery = "where('id','>',0)";
}
$batch = MyModel::whereHas('asset',function ($query) use ($assetQuery){return $query->$assetQuery;})
->orderBy('id', 'desc')->take(20)->get();

$settings是我的JSON的json_decode代表。它只有一条指令来到$assetQuery。如您所见,如果它没有任何这些指令,它将选择所有指令(where('id','>',0))。

我的问题是我似乎无法将$assetQuery字符串附加到$batch Eloquent行。我该怎么做才能将变量查询串起来?

我确实看到了这一点:Laravel Advanced Wheres how to pass variable into function?

但是在这种情况下,变量被用在查询的一个非常小的部分中,而不是整个查询字符串。也许我需要在function ($query)函数中移动我的条件?

1 个答案:

答案 0 :(得分:1)

我并不是100%确定您的确切要求,但我认为以下内容对您有用。

$batch = MyModel::whereHas('asset', function ($query) use ($settings){
    if(isset($settings->new)){
        $query->where('created_at','>',Carbon::now()->subMonths(1));
    }
    if(isset($settings->long)){
        $query->where('lengthD','Long');
    }
    if(isset($settings->short)){
        $query->where('lengthD','Short');
    }
    if(!isset($settings->new)&&!isset($settings->long)&&!isset($settings->short)){
        $query->where('id','>',0);
    }
})->orderBy('id', 'desc')->take(20)->get();
相关问题