使用 Laravel 过滤所有属性中的值

Posted

技术标签:

【中文标题】使用 Laravel 过滤所有属性中的值【英文标题】:Filter a value in all properties with Laravel 【发布时间】:2021-04-06 05:16:50 【问题描述】:

这个问题与Laravel filter a value in all columns 非常相似。抱歉,如果以后发现它是重复的,但我还有另一个工作代码要提供。

有效的是通过 javascript 在客户端进行过滤:

    filterfunction : function(entry, filter)
    
        if(filter != null)
            filter.trim().split(' ').forEach(function(item)
                if(!this.eachRecursive(entry, item))
                    return false;
            );                    
        return true;
    ,
    eachRecursive: function(obj, localfilter) 
        for(const key in obj) 
            if (!obj.hasOwnProperty(key))
                continue;
            if(typeof obj[key] == "object" && obj[key] !== null)
                if(this.eachRecursive(obj[key], localfilter))
                    return true;
            
            else
            if((obj[key] + "").toLowerCase().indexOf(localfilter.toLowerCase()) != -1)
                return true;
        
        return false;
    ,

filter 函数用作 Bootstrap-Vue 表格组件的过滤函数,如 custom-filter-function 中所述。

现在的问题是:如何在 Laravel-Backend 中实现类似的功能(与 Livewire 一起使用)?

我可以想象,通过 getColumnListing 列出所有列,在 Laravel filter a value in all columns 中提到是可能的,但这还不够,我仍然需要关系,就像在 laravel mysql query with multiple where orwhere and inner join 中一样。 目前,我正在尝试将 Eloquent 对象转换为 JSON,然后对其进行解析,因为它包含所有已加载的关系 eloquent-serialization。但这似乎是最后的手段,也是对序列化的一种滥用。

【问题讨论】:

伟大的研究工作。因为您还想过滤相关记录,所以问题变得非常复杂。你可以编写复杂的数据库查询,或者让 php/Laravel 为你做所有的过滤。甚至可以将 ElasticSearch 添加到堆栈中。这取决于您要达到的目标。 我考虑过使用 Laravel Scout 进行全文搜索。但这样做的主要特点是:按相关性排序。我本身不需要这个。但我也没有任何关于 Scout 组件的经验,所以我不能说开销是否适合我的用例。 看起来不错。请记住,它可能会为数据创建单独的存储(与 ElasticSearch 相同),这意味着内容可能会不同步(您的搜索索引可能会返回过时或已删除的结果)。 【参考方案1】:

现在我将使用转换为 json 的路由。但是,我找到了一种不通过正则表达式解析 json 的方法。相反,我将 jsonified 集合转换回 php 对象。有了它们,我可以从上面重新实现功能:

private function eachRecursive(stdClass $obj, string $localfilter) 
    foreach($obj as $key => $val)
        if(is_object($val))
            if($this->eachRecursive($val, $localfilter))
                return true;
         elseif(is_array($val))
            foreach($val as $k => $v)
                if($this->eachRecursive($v, $localfilter))
                    return true;
         elseif(stripos(strval($val), $localfilter) !== false)
            return true;
        
    
    return false;


private function filterfunction(Collection $collection, string $filter)
    $retVal = [];

    foreach (json_decode($collection->toJson()) as $entity)
        foreach(explode(' ', trim($filter)) as $localfilter)
            if(!$this->eachRecursive($entity, $localfilter))
                continue 2;
        array_push($retVal, $entity->id);
    

    return $retVal;

【讨论】:

以上是关于使用 Laravel 过滤所有属性中的值的主要内容,如果未能解决你的问题,请参考以下文章

Lumen/Laravel Eloquent - 按数据透视表中的属性过滤

larave学习笔记1-安装配置

我想自学laraver,请诸位前辈给一些建议,谢谢

Larave中CSRF攻击

Laravel 刀片上的 Vuejs

Larave使用composer安装无反应,提示“Changed current directory to C:/Users/Administrator/AppData/Roaming/Compose