He aquí una forma en que lo hago después de investigarlo por un tiempo. Quería hacer un punto final de API Laravel que verifique si un campo está "en uso", por lo que la información importante es: 1) ¿qué tabla de DB? 2) ¿Qué columna de DB? y 3) ¿hay un valor en esa columna que coincida con los términos de búsqueda?
Sabiendo esto, podemos construir nuestra matriz asociativa:
$SEARCHABLE_TABLE_COLUMNS = [
'users' => [ 'email' ],
];
Luego, podemos establecer nuestros valores que verificaremos:
$table = 'users';
$column = 'email';
$value = 'alice@bob.com';
Luego, podemos usar array_key_exists()
y in_array()
entre sí para ejecutar un combo de uno, dos pasos y luego actuar según la truthy
condición:
// 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);
Pido disculpas por el código PHP específico de Laravel, pero lo dejaré porque creo que puede leerlo como pseudocódigo. La parte importante son las dos if
declaraciones que se ejecutan sincrónicamente.
array_key_exists()
y in_array()
son funciones PHP.
fuente:
Lo bueno del algoritmo que he mostrado antes es que se puede hacer un extremo REST como GET /in-use/{table}/{column}/{value}
(donde table
, column
y value
son variables).
Podrías tener:
$SEARCHABLE_TABLE_COLUMNS = [
'accounts' => [ 'account_name', 'phone', 'business_email' ],
'users' => [ 'email' ],
];
y luego puede realizar solicitudes GET como:
GET /in-use/accounts/account_name/Bob's Drywall
(es posible que deba codificar uri en la última parte, pero generalmente no)
GET /in-use/accounts/phone/888-555-1337
GET /in-use/users/email/alice@bob.com
Tenga en cuenta también que nadie puede hacer:
GET /in-use/users/password/dogmeat1337
porque password
no aparece en su lista de columnas permitidas para user
.
Buena suerte en tu viaje.