Вот способ, которым я делаю это после некоторого исследования. Я хотел создать конечную точку 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);
Я прошу прощения за специфичный для Laravel PHP-код, но я оставлю его, потому что я думаю, что вы можете прочитать его как псевдокод. Важная часть - это два 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
.
Удачи в вашем путешествии.