Laravel: «заставить» конструктор запросов вернуть пустой список - PullRequest
1 голос
/ 31 января 2020

У меня есть следующие маршруты:

Route::apiResource('payments', 'PaymentController', ['except' => ['store', 'destroy']]);

Route::get('users/{user}/payments', [
    'as' => 'users.payments',
    'uses' => 'PaymentController@index',
]);

И этот контроллер:

class PaymentController
{
    public function index(Request $request, User $user)
    {
        // Initialize query builder
        $query = Payment::query();

        // If a user was provided, return all payments belonging to that user
        // if condition is satisfied
        if ($user) {
            if (condition) {
                $query = $customer->payments();
            } else {
                // Some code that causes no results
                $query->whereNull('id');   // <----- This hits the database
            }
        }

        return PaymentResource::collection($query->paginate(10));
    }
}

Если вы нажмете /payments, он должен вернуть все платежи, сделанные всеми пользователями.

Если вы нажмете /users/id/payments, он должен вернуть все платежи, сделанные пользователем, только если condition имеет значение true, в противном случае он должен вернуть пустой список.

Этот код работает, однако $query->whereNull('id'); - это обходной путь который действительно попадает в базу данных.

Есть ли способ избежать попадания в базу данных и при этом вернуть пустой список?

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 04 февраля 2020

Я пытался получить однократный возврат в функцию, но проще следовать совету, который дал @Chin Leung (спасибо!)

class PaymentController
{
    public function index(Request $request, User $user)
    {
        // Initialize query builder
        $query = Payment::query();

        // If a user was provided, return all payments belonging to that user
        // if condition is satisfied
        if ($user) {
            if (condition) {
                $query = $customer->payments();
            } else {
                // Some code that causes no results
                return PaymentResource::collection(collect());
            }
        }
        // Other code here, for example a where statement
        // depending on what is passed in $request


        return PaymentResource::collection($query->paginate(10));
    }
}
0 голосов
/ 31 января 2020

Вы можете избежать попадания в базу данных и при этом возвращать пустой список, используя инициализированную переменную, для пустой коллекции или массива

class PaymentController
{
    public function index(Request $request, User $user)
    {
        // Initialize query builder
        $query = Payment::query();

        // If a user was provided, return all payments belonging to that user
        // if condition is satisfied
        $return = collect();
        if ($user) {
            if (condition) {
                $return = $customer->payments()->paginate(10);
            } 
        }

        return PaymentResource::collection($return);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...