Laravel Eloquent如何动态传入字符串格式的查询参数?
正确传入方式说明
你的错误原因是:用{$query}的方式是尝试访问Eloquent Builder实例的属性,但你的$query字符串里是方法调用链(比如->whereIn(...)),并不是属性名,所以框架找不到对应的属性,抛出错误。
下面是两种可行的解决方法:
方法一:使用eval执行字符串代码(需谨慎)
这种方法直接执行你定义的字符串代码,但要注意仅当$query的内容完全可信时才用,避免代码注入风险:
$query = '->whereIn(\'short_code\', ["9999"])->whereBetween(\'request_timestamp\', [request(\'startTime\'), request(\'endTime\')]);'; $builder = InboundMessage::query(); // 执行字符串中的方法调用链 eval("\$builder = \$builder$query"); // 执行查询 $results = $builder->get();
方法二:用闭包/动态方法调用(推荐,更安全)
这是Laravel推荐的写法,避免使用eval带来的安全问题,同时更易维护:
方式A:直接链式调用查询方法
$builder = InboundMessage::query() ->whereIn('short_code', ["9999"]) ->whereBetween('request_timestamp', [request('startTime'), request('endTime')]); // 执行查询 $results = $builder->get();
方式B:动态遍历条件数组(适合动态生成查询的场景)
如果你的查询条件是动态生成的,可以把方法和参数存在数组里,循环调用:
// 定义查询条件:每个元素是[方法名, 参数数组] $queryConditions = [ ['whereIn', ['short_code', ["9999"]]], ['whereBetween', ['request_timestamp', [request('startTime'), request('endTime')]]] ]; $builder = InboundMessage::query(); // 循环调用每个查询方法 foreach ($queryConditions as [$method, $params]) { $builder->$method(...$params); } // 执行查询 $results = $builder->get();
内容的提问来源于stack exchange,提问作者stilinski254
相关产品推荐
相关产品推荐

