Laravel — фильтровать коллекцию по динамическому полю

Модель имеет 3 поля, которые являются атрибутами модели, а 4-е поле — это динамическое поле, которое называется «fullTitle».

[
    {
    "id": 1,
    "hours": 2000,
    "car_id": 3,
    "fullTitle": "Test",
    }
}
<?php

namespace App;

use App\Car;



class VenderModel extends Model
{
    use TranslationTrait;

    protected $guarded = ['*'];

    /**
     * The accessors to append to the model's array form.
     *
     * @var array
     */
    protected $appends = [
        'fullTitle'
    ];


    /**
     * Accessor for dynamic property fullTitle to use as selector name.
     * @param string $locale
     * @return null|string|string[]
     */
    public function getFullTitleAttribute($locale = 'es')
    {
        if (null === $this->hasTranslation()) {
            return trans('errors.No name');
        }

        return preg_replace('/\s{2,}/', ' ', $this->code.' '. $this->translationOrFirst($locale)->translation);
    }

}



    public function index(Request $request): JsonResponse
    {
        $limit      = $request->input('limit', 25);
        $title      = $request->input('title');

        $query = VenderModel::all();

        $query->when($request->query('title'), function ($q) use ($title) {
            return $q->where('fullTitle', 'like', '%' . $title . '%');
        });

        return response()->json($query, 200);

    }

Я пытаюсь подобрать элементы с полным заголовком, но не работает.

fullTitle не является полем БД, верно?
Tarasovych 18.07.2019 13:50

Вы получаете ошибку? Если да, то предоставьте его нам.

NoOorZ24 18.07.2019 13:55

@Tarasovych это не поле БД, это динамическое поле

edica 18.07.2019 14:00

Итак, вам нужно «вычислить» fullTitle все объекты, которые вы хотите отфильтровать.

Tarasovych 18.07.2019 14:17
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
0
4
1 612
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

$collection = VenderModel::get();

$collection->filter(function($item) use($title) {
    return preg_match('/.*'.$title.'.*/', $item->fullTitle) !== false;
});

return response()->json($collection, 200);

Я думаю, что это должно решить это. Вы не можете использовать запрос к полю, которое на самом деле не является полем в вашей таблице, но вы должны иметь возможность фильтровать его как коллекцию.

Примечание: это решение плохо масштабируется при больших объемах данных. Если вы хотите, чтобы он масштабировался, вам в основном нужно хранить переводы в другой таблице и использовать соединения, но если у вас будет около 100 записей, это не имеет значения.

NoOorZ24 23.07.2019 12:18
Ответ принят как подходящий

Вы не можете попросить свою базу данных искать что-то, чего на самом деле нет в таблице.

Пользовательские атрибуты вызываются только тогда, когда вы запрашиваете производное свойство. Их нельзя использовать в запросе.

В качестве альтернативы вы можете захватить ВСЕ строки в памяти, а затем отфильтровать их с помощью PHP, но это не очень хороший способ.

Также вы можете подумать о сохранении перевода определенного свойства в связанной таблице, а затем выполнять поиск в базе данных по отношению.

Другие вопросы по теме