Saya memiliki rute ini:

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

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

Dan pengontrol ini:

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));
    }
}

Jika Anda menekan /payments, itu akan mengembalikan semua pembayaran yang dilakukan oleh semua pengguna.

Jika Anda menekan /users/id/payments itu akan mengembalikan semua pembayaran yang dilakukan oleh pengguna hanya jika condition benar, jika tidak maka akan mengembalikan daftar kosong.

Kode ini berfungsi, namun $query->whereNull('id'); adalah solusi yang benar-benar mengenai database.

Apakah ada cara untuk menghindari memukul database dan masih mengembalikan daftar kosong?

Terima kasih sebelumnya

1
TJ is too short 31 Januari 2020, 21:02

2 jawaban

Jawaban Terbaik

Saya mencoba untuk mendapatkan pengembalian tunggal dalam fungsi, tetapi lebih mudah untuk mengikuti saran yang diberikan @Chin Leung (terima kasih!)

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
TJ is too short 4 Februari 2020, 09:27

Anda dapat menghindari memukul database dan masih mengembalikan daftar kosong menggunakan variabel yang diinisialisasi ke koleksi atau larik kosong

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);
    }
}
0
Foued MOUSSI 31 Januari 2020, 19:51