You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 09:10:36