Laravel / PHP - 将多个值推送到查询字符串(相同参数)

Laravel / PHP - Push multiple values to query string (same parameter)

运行 在这里用查询 String/Parameter 建筑变成一堵砖墙,我觉得它不应该这么复杂,但想获得最佳实践建议。

我目前正在构建一个社区平台,allows/requires 用户可以用来标记他们的内容。内容通过两个查询字符串参数进行标记。

请注意所有关系,包括 attaching/detaching 在内的帖子标记逻辑已完成,这纯粹是一个过滤系统问题。

类别 - 帖子必须有一个类别但只有一个类别,在搜索查询字符串时将按此附加。例如。 ?类别=植物

标签 - 帖子可以有(可选)许多标签,这将附加到查询字符串中。例如。标签=耐寒

到目前为止。我创建了两个函数(通过 helper.php 文件)“add_query_params”和“remove_query_params”。这些很有用,因为它允许我添加和删除 ?category 或 ?tag 而无需删除另一个。我的问题是,我似乎一辈子都想不出如何将多个相同的标签添加到查询字符串中,以允许我过滤多个参数选项!

例如

我可以建造

website.com?category=plants&tags=hardy 

// I can also remove either tag without affecting the other

我无法构建


.com?category=plants&tags=hardy&tags=perenial
// (I can't add two of the same tag to the query string to allow me to filter on these in the controller/request

允许我add/remove标签的函数如下


/**
 * URL before:
 * https://example.com/orders/123?order=ABC009&status=shipped
 *
 * 1. remove_query_params(['status'])
 * 2. remove_query_params(['status', 'order'])
 *
 * URL after:
 * 1. https://example.com/orders/123?order=ABC009
 * 2. https://example.com/orders/123
 */
function remove_query_params(array $params = [])
{
    $url = url()->current(); // get the base URL - everything to the left of the "?"
    $query = request()->query(); // get the query parameters (what follows the "?")

    foreach($params as $param) {
        unset($query[$param]); // loop through the array of parameters we wish to remove and unset the parameter from the query array
    }

    return $query ? $url . '?' . http_build_query($query) : $url; // rebuild the URL with the remaining parameters, don't append the "?" if there aren't any query parameters left
}

/**
 * URL before:
 * https://example.com/orders/123?order=ABC009
 *
 * 1. add_query_params(['status' => 'shipped'])
 * 2. add_query_params(['status' => 'shipped', 'coupon' => 'CCC2019'])
 *
 * URL after:
 * 1. https://example.com/orders/123?order=ABC009&status=shipped
 * 2. https://example.com/orders/123?order=ABC009&status=shipped&coupon=CCC2019
 */
function add_query_params(array $params = [])
{

    $query = array_merge(
        request()->query(),
        $params
    ); // merge the existing query parameters with the ones we want to add


    return url()->current() . '?' . http_build_query($query); // rebuild the URL with the new parameters array
}


在 blade 评论中,他们会这样称呼

//Add query param
<a href="{{add_query_params(['tags' => $tag->id]) }}"
                class="inline-block bg-gray-100  px-3 py-1 text-xs uppercase font-button">
                #{{$tag->name}}
</a>


//Remove query param
<a href="{{remove_query_params(['category']) }}"
                class="inline-block bg-gray-300  px-3 py-1 text-xs uppercase font-button">
                #{{$has_category->name}}
                            
 </a>

这让我疯狂,大多数网站,e-commerce,旅游网站允许您更新查询字符串,我觉得这种方法最容易从网站的任何地方调用并且不可知论被束缚对于特定的页面、功能,它还使构建器可扩展并可重复用于更多标签。

但我就是想不通。

有人对如何向查询字符串添加多个标签有任何提示或指导吗????

干杯

你可以试试这个:
.com?category=plants&tags=hardy,perenial.
通过
$tags = explode(',', request()->tags);

从查询字符串中获取控制器中的标签作为数组

添加标签功能:

add_query_params(array $params = [])    {        
    // defining parameters being used in requests
    $tags = request()->tags;

    // param key (name) and its value being added
    $param = null
    $value = null;
    foreach($params as $key => $value){
        $param = $key;
        $value = $val;
    }

    // merging new ones
    switch ($key) {
        case 'tags':
            array_push($tags, $value)
            break;
        case 'some other param':
            // push value to array, like tags case
            break;
        default:
            break;
     }

     $query = array_merge(request()->query(),$tags);
     return http_build_query($query); 
     // rebuild the URL with the new parameters array 
} 

你不能那样做。这就像您为一个变量重新分配了一个新值。旧的要丢了。

你可以做的是传递一个 comma-separated 字符串,例如:

tags=test1,test2,test3

作为查询参数中的值。然后使用 explode() 函数从中创建一个数组并使用这些值。

另一个想法是,您的查询参数是作为数组创建的,因此您应该有类似的东西:

tags[]=test1&tags[]=test2&tags[]=test3

这样当您请求参数时 tags 您已经有了一个可以使用的数组并且对您的第一种方法关闭。

所以你实际上在数组中插入了新值 tags