如何用Saloon(PHP)添加同名不同值的多个查询参数?
在Saloon中生成重复同名查询参数(不带[])
当你需要生成形如/?param1=val1¶m2=val2¶m3=val3¶m3=val4的URL时,Saloon默认的数组参数处理会生成带[]的格式,你可以通过以下几种方式实现需求:
方法一:逐个添加同名参数
使用query()->add()方法代替数组set(),因为add()允许重复添加同一个键名的参数,不会将数组转换为带[]的格式:
$this->query()->add('param1', 'val1'); $this->query()->add('param2', 'val2'); $this->query()->add('param3', 'val3'); $this->query()->add('param3', 'val4');
这种方式直接直观,适合参数数量不多的场景。
方法二:自定义查询字符串生成逻辑
如果需要批量处理数组参数,可以在你的Request类中重写getQueryString()方法,自定义数组参数的展开规则:
protected function getQueryString(): string { $queryItems = []; foreach ($this->query()->all() as $key => $value) { // 处理数组类型的参数,展开为多个同名键值对 if (is_array($value)) { foreach ($value as $item) { $queryItems[] = urlencode($key) . '=' . urlencode($item); } } else { $queryItems[] = urlencode($key) . '=' . urlencode($value); } } return implode('&', $queryItems); }
之后你依然可以用原来的数组方式设置参数:
$this->query()->set([ 'param1' => 'val1', 'param2' => 'val2', 'param3' => ['val3', 'val4'] ]);
重写后的方法会自动将数组参数展开为不带[]的重复同名参数。
方法三:预处理参数为键值对集合
如果你的参数是动态生成的,可以先将数组参数转换为包含重复键的键值对集合,再批量添加:
// 构造包含重复键的参数集合 $rawParams = [ 'param1' => 'val1', 'param2' => 'val2', 'param3' => ['val3', 'val4'], ]; // 转换为扁平的键值对数组 $flatParams = []; foreach ($rawParams as $key => $value) { if (is_array($value)) { foreach ($value as $item) { $flatParams[] = [$key, $item]; } } else { $flatParams[] = [$key, $value]; } } // 批量添加到查询参数 foreach ($flatParams as [$key, $val]) { $this->query()->add($key, $val); }
这种方式适合参数结构复杂、需要动态处理的场景。
内容的提问来源于stack exchange,提问作者Dr. Gianluigi Zane Zanettini
相关产品推荐
相关产品推荐

