Inilah cara saya melakukannya setelah menelitinya untuk sementara waktu. Saya ingin membuat titik akhir API Laravel yang memeriksa apakah suatu bidang "sedang digunakan", jadi informasi pentingnya adalah: 1) tabel DB yang mana? 2) apa kolom DB? dan 3) apakah ada nilai di kolom itu yang cocok dengan istilah pencarian?
Mengetahui hal ini, kita dapat membuat array asosiatif kita:
$SEARCHABLE_TABLE_COLUMNS = [
'users' => [ 'email' ],
];
Kemudian, kita dapat menetapkan nilai yang akan kita periksa:
$table = 'users';
$column = 'email';
$value = 'alice@bob.com';
Kemudian, kita dapat menggunakan array_key_exists()dan in_array()dengan satu sama lain untuk mengeksekusi kombo satu, dua langkah dan kemudian bertindak berdasarkan truthykondisi:
// step 1: check if 'users' exists as a key in `$SEARCHABLE_TABLE_COLUMNS`
if (array_key_exists($table, $SEARCHABLE_TABLE_COLUMNS)) {
// step 2: check if 'email' is in the array: $SEARCHABLE_TABLE_COLUMNS[$table]
if (in_array($column, $SEARCHABLE_TABLE_COLUMNS[$table])) {
// if table and column are allowed, return Boolean if value already exists
// this will either return the first matching record or null
$exists = DB::table($table)->where($column, '=', $value)->first();
if ($exists) return response()->json([ 'in_use' => true ], 200);
return response()->json([ 'in_use' => false ], 200);
}
// if $column isn't in $SEARCHABLE_TABLE_COLUMNS[$table],
// then we need to tell the user we can't proceed with their request
return response()->json([ 'error' => 'Illegal column name: '.$column ], 400);
}
// if $table isn't a key in $SEARCHABLE_TABLE_COLUMNS,
// then we need to tell the user we can't proceed with their request
return response()->json([ 'error' => 'Illegal table name: '.$table ], 400);
Saya minta maaf untuk kode PHP khusus Laravel, tetapi saya akan membiarkannya karena saya rasa Anda dapat membacanya sebagai kode semu. Bagian penting adalah dua ifpernyataan yang dieksekusi secara sinkron.
array_key_exists()dan in_array()merupakan fungsi PHP.
sumber:
Yang menyenangkan tentang algoritma yang saya menunjukkan di atas adalah bahwa Anda dapat membuat endpoint SISA seperti GET /in-use/{table}/{column}/{value}(di mana table, columndanvalue adalah variabel).
Kamu bisa saja:
$SEARCHABLE_TABLE_COLUMNS = [
'accounts' => [ 'account_name', 'phone', 'business_email' ],
'users' => [ 'email' ],
];
dan kemudian Anda dapat membuat permintaan GET seperti:
GET /in-use/accounts/account_name/Bob's Drywall (Anda mungkin perlu menyandikan uri bagian terakhir, tetapi biasanya tidak)
GET /in-use/accounts/phone/888-555-1337
GET /in-use/users/email/alice@bob.com
Perhatikan juga bahwa tidak ada yang bisa melakukan:
GET /in-use/users/password/dogmeat1337karena passwordtidak tercantum dalam daftar kolom yang diizinkan untuk user.
Semoga berhasil dalam perjalanan Anda.