Đây là một cách tôi đang làm sau khi nghiên cứu một thời gian. Tôi muốn tạo một điểm cuối API của Laravel để kiểm tra xem một trường có "đang sử dụng" không, vì vậy thông tin quan trọng là: 1) bảng DB nào? 2) cột DB nào? và 3) có một giá trị trong cột đó phù hợp với các cụm từ tìm kiếm không?
Biết được điều này, chúng ta có thể xây dựng mảng kết hợp của mình:
$SEARCHABLE_TABLE_COLUMNS = [
'users' => [ 'email' ],
];
Sau đó, chúng tôi có thể đặt các giá trị mà chúng tôi sẽ kiểm tra:
$table = 'users';
$column = 'email';
$value = 'alice@bob.com';
Sau đó, chúng ta có thể sử dụng array_key_exists()
và in_array()
với nhau để thực hiện kết hợp một, hai bước và sau đó hành động theo truthy
điều kiệ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);
Tôi xin lỗi vì mã PHP dành riêng cho Laravel, nhưng tôi sẽ bỏ nó vì tôi nghĩ bạn có thể đọc nó dưới dạng mã giả. Phần quan trọng là hai if
câu lệnh được thực thi đồng bộ.
array_key_exists()
và in_array()
là các hàm PHP.
nguồn:
Những điều tốt đẹp về các thuật toán mà tôi đã giới thiệu ở trên là bạn có thể tạo ra một thiết bị đầu cuối như REST của GET /in-use/{table}/{column}/{value}
(nơi table
, column
vàvalue
là các biến).
Bạn có thể có:
$SEARCHABLE_TABLE_COLUMNS = [
'accounts' => [ 'account_name', 'phone', 'business_email' ],
'users' => [ 'email' ],
];
và sau đó bạn có thể thực hiện các yêu cầu GET như:
GET /in-use/accounts/account_name/Bob's Drywall
(bạn có thể cần mã hóa uri phần cuối, nhưng thường thì không)
GET /in-use/accounts/phone/888-555-1337
GET /in-use/users/email/alice@bob.com
Cũng lưu ý rằng không ai có thể làm:
GET /in-use/users/password/dogmeat1337
bởi vì password
không được liệt kê trong danh sách các cột được phép của bạn cho user
.
Chúc may mắn trên hành trình của bạn.