Laravel: как отфильтровать пользовательский атрибут GetAttribute перед сбором - PullRequest
0 голосов
/ 22 марта 2020

Я могу отфильтровать поле Custom Get Attribute после извлечения его в collection. Теперь мне нужно отфильтровать перед использованием get()

Пример:

Для is_paid настраиваемый атрибут

//is_paid
public function getIsPurchasedAttribute()
{
    //Since purchased has one relation with user
    return !empty($this->purchasedRelation) ? true : false;
}

Теперь мне нужно получить User на основе is_purchased например:

public function index(Request $request){
        $isPaid = $request->is_paid;

        $users = User::query();

        if($isPaid){
            $users = $users->where('is_paid', true);

        }

        $users = $users->paginate(10);

        return view('user.index', [
            'users' => $users
        ]);

    }

Если мне это нравится, он вернет:

Столбец не найден: 1054 Неизвестный столбец 'is_paid' в 'выражении where

Да, я могу делать как, но теперь я не могу использовать функцию paginate:

$users = User::get();

$users = $users->where('is_paid', 1);

return view('user.index', [
    'users' => $users
]);

Ответы [ 2 ]

0 голосов
/ 29 марта 2020

Если кто-то сталкивается с той же ошибкой и для дальнейшего использования, я публикую метод, который я использовал для решения проблемы:

Созданный пользовательский getAttribute может быть получен только после извлечения модели.

То есть используется first() или find()

. Вы не можете фильтровать в коллекции запросов.

Таким образом, чтобы отфильтровать только атрибут is_paid; Сначала я извлек коллекцию моделей и отфильтровал впоследствии, как:

public function index(Request $request){
    $isPaid = $request->is_paid;

    $users = User::get();

    if($isPaid){
        $users = $users->where('is_paid', true);

    }

    $users = $users->paginate(10);

    return view('user.index', [
        'users' => $users
    ]);

}

Чтобы использовать нумерацию страниц для сбора, я следовал Gist Для разбитых на страницы коллекций в Laravel

0 голосов
/ 22 марта 2020

Вы можете вернуть всех пользователей, у которых есть покупки, по методу whereHas().

public function index(Request $request){
    $users = User::query();

    if ($request->is_paid) {
        $users->whereHas('purchasedRelation');
    }

    return view('user.index', [
        'users' => $users->paginate(10),
    ]);
}
...