Ось як я це роблю, коли досліджую це деякий час. Я хотів зробити кінцеву точку API Laravel, яка перевіряє, чи поле "використовується", тому важливою інформацією є: 1) яка таблиця БД? 2) яка колонка БД? і 3) чи є в цьому стовпці значення, яке відповідає пошуковим термінам?
Знаючи це, ми можемо побудувати наш асоціативний масив:
$SEARCHABLE_TABLE_COLUMNS = [
'users' => [ 'email' ],
];
Потім ми можемо встановити наші значення, які ми перевіримо:
$table = 'users';
$column = 'email';
$value = 'alice@bob.com';
Тоді ми можемо використовувати array_key_exists()
та in_array()
разом з іншим виконувати комбінацію в один та два кроки, а потім діяти за truthy
умовою:
// 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);
Прошу вибачення за специфічний для PHP-код Laravel код, але я покину його, тому що, думаю, ви можете прочитати його як псевдо-код. Важлива частина - це два if
твердження, які виконуються синхронно.
array_key_exists()
і in_array()
є функціями PHP.
джерело:
Хороша річ про алгоритм , який я показав вище, що ви можете зробити REST кінцевої точки , такі як GET /in-use/{table}/{column}/{value}
(де table
, column
і value
змінні).
Ви можете мати:
$SEARCHABLE_TABLE_COLUMNS = [
'accounts' => [ 'account_name', 'phone', 'business_email' ],
'users' => [ 'email' ],
];
і тоді ви можете зробити GET запити, такі як:
GET /in-use/accounts/account_name/Bob's Drywall
(можливо, вам потрібно буде uri кодувати останню частину, але зазвичай ні)
GET /in-use/accounts/phone/888-555-1337
GET /in-use/users/email/alice@bob.com
Зауважте також, що ніхто не може:
GET /in-use/users/password/dogmeat1337
тому що password
не вказано у вашому списку дозволених стовпців для user
.
Удачі у вашій подорожі.