【问题标题】:Convert String to Eloquent functions将字符串转换为 Eloquent 函数
【发布时间】:2020-03-14 10:34:05
【问题描述】:

我正在用 laravel 构建一个 API,所以我试图将 Laravel 的 Eloquent 函数作为字符串传递并在控制器中执行它们,实际上我正在发送一个 JSON 对象,但我正在将它转换为后端的字符串,这就是我试着做

带参数的 API URL: http://www.example.com/api/articles?parameters={"orderByDesc":"'created_at'", "limit":"2"}

控制器端:

$json = json_decode(request('parameters'), TRUE);

$query = '';

foreach ($json as $function => $value){

    $query .= $function.'('.$value.')->';

}

$query = $query.'get();';

return $query;

输出:

orderByDesc('created_at')->limit(2)->get();

现在我如何在模型上执行这个字符串作为代码,例如:

$articles = Article::orderByDesc('created_at')->limit(2)->get();

我无法像这样连接:Article::.$query 而且我不能使用 PHP 的 eval()

这个想法是在 JSON 对象中使用 Laravel 的 Eloquent 函数并将它们传递到一个 URL 参数中。

谢谢

【问题讨论】:

  • 这是我见过的最可怕的事情。为什么有人这样做
  • 我明白你的意思@TeomanTıngır 但这是一个内部 API,大多数 Laravel 开发人员都会使用
  • 这在很多地方都是错误的。为什么不将参数(在您的情况下为 JSON)作为标准查询参数。然后在您的控制器中构造一个适当的 JSON 并继续执行。如果您确实必须发送 JSON,请在 POST 请求中发送它,而不是在 GET 中发送查询参数。还使用字符串连接来构建可执行代码是如此 hacky。请不要那样做。
  • @Prakhar 我也会考虑这个

标签: php json laravel api eloquent


【解决方案1】:

也许你应该试试这个。

$json = json_decode(request('parameters'), true);

$query = Article::query();

foreach($json as $function => $value){
    $query->{$function}($value);
}

$query = $query->get();

return $query;

您可以使用->{$func_name} 语法在对象上运行函数

编辑:您也可以传递多个参数。但是你可以检查 value 是否是数组:

foreach($json as $function => $value){
    if(is_array($value)) {
        $query->{$function}(...$value);
    } else {
        $query->{$function}($value);
    }
}

在这种情况下,您可以拥有:{"orderByDesc":"'created_at'", "limit":"2", "where": ["column_name", "LIKE", "%SOME_STRING"]},它将生成相当于:->where('column_name', 'LIKE', '%SOME_STRING')的查询

【讨论】:

    最近更新 更多