Отфильтровать значение во всех свойствах с помощью Laravel

Этот вопрос очень похож на 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, как описано в пользовательской функции фильтра.

Теперь вопрос: как добиться аналогичной функциональности в Laravel-Backend (для использования с Livewire)?

Я могу представить, что список всех столбцов через getColumnListing, упомянутый в Laravel, фильтрует значение в все столбцы возможны, но этого будет недостаточно, мне все еще нужны отношения, как в запрос laravel mysql с несколькими where илиwhere и внутренним соединением. В настоящее время я пытаюсь преобразовать объект Eloquent в JSON, а затем проанализировать его, так как он включает все загруженные отношения красноречивая сериализация. Но это похоже на последнее средство и своего рода неправильное использование сериализации.


person Sandman    schedule 29.12.2020    source источник
comment
Отличная работа над исследованием. Поскольку вы также хотите отфильтровать связанные записи, проблема становится чрезвычайно сложной. Вы можете написать сложные запросы к базе данных или позволить PHP/Laravel сделать всю фильтрацию за вас. В стек можно даже добавить ElasticSearch. Это зависит от того, чего вы пытаетесь достичь.   -  person Joshua Angnoe    schedule 29.12.2020
comment
Я думал об использовании Laravel Scout для полнотекстового поиска. Но главная особенность этого: сортировка по релевантности. Мне это не нужно само по себе. Но у меня также нет никакого опыта работы с компонентом Scout, поэтому я не могу сказать, оправданы ли накладные расходы для моего варианта использования.   -  person Sandman    schedule 29.12.2020
comment
Выглядит прилично. Имейте в виду, что он, вероятно, создаст отдельное хранилище для данных (такое же, как ElasticSearch), а это означает, что данные могут не синхронизироваться (ваш поисковый индекс может возвращать устаревшие или удаленные результаты).   -  person Joshua Angnoe    schedule 29.12.2020


Ответы (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;
}
person Sandman    schedule 30.12.2020