Oto sposób, w jaki robię to po pewnym czasie badania. Chciałem stworzyć punkt końcowy API Laravel, który sprawdza, czy pole jest „używane”, więc ważne informacje to: 1) która tabela DB? 2) jaka kolumna DB? i 3) czy w tej kolumnie znajduje się wartość, która pasuje do wyszukiwanych haseł?
Wiedząc to, możemy skonstruować naszą tablicę asocjacyjną:
$SEARCHABLE_TABLE_COLUMNS = [
'users' => [ 'email' ],
];
Następnie możemy ustawić nasze wartości, które sprawdzimy:
$table = 'users';
$column = 'email';
$value = 'alice@bob.com';
Następnie możemy użyć array_key_exists()
i in_array()
wspólnie wykonać jedno, dwuetapowe combo, a następnie działać pod truthy
warunkiem:
// 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);
Przepraszam za kod PHP specyficzny dla Laravel, ale zostawię go, ponieważ myślę, że można go odczytać jako pseudokod. Ważną częścią są dwie if
instrukcje, które są wykonywane synchronicznie.
array_key_exists()
i in_array()
są funkcjami PHP.
źródło:
Zaletą algorytmu, który pokazałem powyżej jest to, że można zrobić końcowy REST takich jak GET /in-use/{table}/{column}/{value}
(gdzie table
, column
i value
są zmienne).
Możesz mieć:
$SEARCHABLE_TABLE_COLUMNS = [
'accounts' => [ 'account_name', 'phone', 'business_email' ],
'users' => [ 'email' ],
];
a następnie możesz wykonać żądania GET, takie jak:
GET /in-use/accounts/account_name/Bob's Drywall
(może być konieczne zakodowanie ostatniej części w formacie uri, ale zwykle nie)
GET /in-use/accounts/phone/888-555-1337
GET /in-use/users/email/alice@bob.com
Zauważ również, że nikt nie może zrobić:
GET /in-use/users/password/dogmeat1337
ponieważ password
nie ma go na liście dozwolonych kolumn dla user
.
Powodzenia w podróży.