Aqui está uma maneira de fazer isso depois de pesquisar por um tempo. Eu queria criar um ponto de extremidade da API do Laravel que verifique se um campo está "em uso"; portanto, as informações importantes são: 1) qual tabela de banco de dados? 2) qual coluna DB? e 3) existe um valor nessa coluna que corresponda aos termos da pesquisa?
Sabendo disso, podemos construir nossa matriz associativa:
$SEARCHABLE_TABLE_COLUMNS = [
'users' => [ 'email' ],
];
Então, podemos definir nossos valores que iremos verificar:
$table = 'users';
$column = 'email';
$value = 'alice@bob.com';
Então, podemos usar array_key_exists()
e in_array()
uns com os outros para executar um, dois etapa de combinação e, em seguida, agir sobre a truthy
condição:
// 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);
Peço desculpas pelo código PHP específico do Laravel, mas deixarei porque acho que você pode lê-lo como pseudo-código. A parte importante são as duas if
instruções que são executadas de forma síncrona.
array_key_exists()
e in_array()
são funções PHP.
fonte:
A coisa agradável sobre o algoritmo que eu mostrei acima é que você pode fazer um terminal REST, como GET /in-use/{table}/{column}/{value}
(onde table
, column
e value
são variáveis).
Você pode ter:
$SEARCHABLE_TABLE_COLUMNS = [
'accounts' => [ 'account_name', 'phone', 'business_email' ],
'users' => [ 'email' ],
];
e você pode fazer solicitações GET, como:
GET /in-use/accounts/account_name/Bob's Drywall
(pode ser necessário codificar uri a última parte, mas geralmente não)
GET /in-use/accounts/phone/888-555-1337
GET /in-use/users/email/alice@bob.com
Observe também que ninguém pode fazer:
GET /in-use/users/password/dogmeat1337
porque password
não está listado na sua lista de colunas permitidas para user
.
Boa sorte em sua jornada.