使用 Laravel 过滤所有属性中的值
Filter a value in all properties with Laravel
这个问题与非常相似。抱歉,如果稍后发现它是重复的,但我还有另一个工作代码要提供。
通过 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;
},
过滤器函数用作 Bootstrap-Vue table 组件的过滤器函数,如自定义过滤器函数中所述。
现在的问题是:如何在 Laravel-后端(与 Livewire 一起使用)中实现类似的功能?
我可以想象, 中提到的通过 getColumnListing 列出所有列是可能的,但这还不够,我仍然需要关系,例如 laravel mysql 具有多个 where orwhere 和 inner join 的查询。
目前,我正在尝试将 Eloquent 对象转换为 JSON,然后解析它,因为它包含所有已加载的关系 eloquent-serialization。但这似乎是最后的手段,也是一种对序列化的滥用。
现在我将使用转换为 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;
}
这个问题与
通过 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;
},
过滤器函数用作 Bootstrap-Vue table 组件的过滤器函数,如自定义过滤器函数中所述。
现在的问题是:如何在 Laravel-后端(与 Livewire 一起使用)中实现类似的功能?
我可以想象,
现在我将使用转换为 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;
}