私は、N個のAPIをサポートし、APIごとに別々のデータベーステーブルを持つことを避けるための良いアプローチの簡単な例を作成しました。
ここにデータベーステーブルがあります。
apis
テーブルは、APIに関する情報を保持するapi_list
と同等です。私の例では(私が言ったように、それは本当に簡単です)、私は列name
を追加しました。
CREATE TABLE `apis` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
私はちょうどこの例では、単純なusers
表を作っ:
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`email` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
その後、私は新しいテーブルを作ったが、APIが持つことができるすべてのクレデンシャルタイプを保持するどのcredentials
と呼ばれます。例:ユーザー名、メール、電話番号name
列には、ユーザーフレンドリーな信任状の名前が入ります。
CREATE TABLE `credentials` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
私は1つがcredential
を必要以上を持っているapis
をカバーするアプローチを行ってきました。だから私はapis
とcredentials
の間のピボットテーブルが必要でした。私が必要
CREATE TABLE `api_credential` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`api_id` int(11) NOT NULL,
`credential_id` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
次の表は、api
user
が持っているを保持するテーブルです。これは、user_api_lookup
テーブルと同じです。
CREATE TABLE `api_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`api_id` int(11) NOT NULL,
`user_id` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
そして最後の表は、実際の資格情報api_credential_user
開催するものです。そして、私たちは(このためユーザーartisan
少なくともI)を生成する必要があります
CREATE TABLE `api_credential_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`api_credential_id` int(11) NOT NULL,
`value` text NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
私たちのモデルとそれらの間の関係を設定します。
php artisan make:model Api
php artisan make:model ApiCredential
php artisan make:model ApiCredentialUser
php artisan make:model ApiUser
php artisan make:model Credential
User
モデルはLaravelのインストールが付属しています。
Api
モデルは次のようになります。 (私は各関係のコメントを追加しました)
class Api extends Model
{
protected $table = 'apis';
/**
* As I said an API might have multiple credential types/fields.
*/
public function credentials()
{
return $this->belongsToMany('App\Credential');
}
/**
* This will return all users that have a specific api attached.
*/
public function users()
{
return $this->belongsToMany('App\User');
}
}
Credential
モデル:
class Credential extends Model
{
protected $table = 'credentials';
/**
* Get all apis this credential belongs to.
*/
public function apis()
{
return $this->belongsToMany('App\Api');
}
public function apiCredential() {
return $this->hasOne('App\ApiCredential');
}
}
ApiCredential
モデル:
class ApiCredential extends Model
{
protected $table = 'api_credential';
/**
* Those are defined in the sake of consistency.
* Probably will not be used.
*/
public function api()
{
return $this->belongsTo('App\Api');
}
/**
* Those are defined in the sake of consistency.
* Probably will not be used.
*/
public function credential()
{
return $this->belongsTo('App\Credential');
}
public function user()
{
return $this->hasOne('App\ApiCredentialUser');
}
}
ApiCredentialUser
モデル:
class ApiCredentialUser extends Model
{
protected $table = 'api_credential_user';
}
User
モデル:デモの目的のために
class User extends Model
{
protected $table = 'users';
public function apis()
{
return $this->belongsToMany('App\Api');
}
}
ダミーデータ:これらの関係の
INSERT INTO `users` (`id`, `email`) VALUES (NULL, '[email protected]'), (NULL, '[email protected]');
INSERT INTO `credentials` (`id`, `name`) VALUES (NULL, 'phone_number'), (NULL, 'username'), (NULL, 'email');
INSERT INTO `apis` (`id`, `name`) VALUES (NULL, 'Github API'), (NULL, 'StackOverflow API'), (NULL, 'Twitter API'), (NULL, 'Facebook API'), (NULL, 'LinkedIn API');
INSERT INTO `api_credential` (`id`, `api_id`, `credential_id`) VALUES (NULL, '1', '1'), (NULL, '2', '2'),(NULL, '3', '3'), (NULL, '4', '1'),(NULL, '5', '2');
INSERT INTO `api_user` (`id`, `api_id`, `user_id`) VALUES (NULL, '1', '1'), (NULL, '2', '2');
INSERT INTO `api_credential_user` (`id`, `api_credential_id`, `value`) VALUES (NULL, '1', '0700-1111-2222'), (NULL, '2', 'myUsername');
サンプル用法:
Route::get('/test', function() {
//Fetching all users (dummy data)
$user_1 = App\User::find(1);
$user_2 = App\User::find(2);
//To list every user's apis
echo '<h3>User: ' . $user_1->email . '</h3>';
echo 'Apis attached: <br />';
echo '<ul>';
foreach ($user_1->apis as $api) {
echo '<li>' . $api->name . '</li>';
//You can get required credentials per api.
echo '<ul>';
foreach ($api->credentials as $credential) {
//And for every credential you can get user's value.
echo '<li><b>Name:</b> ' . $credential->name . ' - <b>User value</b>: ' . $credential->apiCredential->user->value . '</li>';
}
echo '</li></ul>';
}
echo '</ul>';
//To list every user's apis
echo '<h3>User: ' . $user_2->email . '</h3>';
echo 'Apis attached: <br />';
echo '<ul>';
foreach ($user_2->apis as $api) {
echo '<li>' . $api->name . '</li>';
//You can get required credentials per api.
echo '<ul>';
foreach ($api->credentials as $credential) {
//And for every credential you can get user's value.
echo '<li><b>Name:</b> ' . $credential->name . ' - <b>User value</b>: ' . $credential->apiCredential->user->value . '</li>';
}
echo '</li></ul>';
}
echo '</ul>';
//To list all apis
echo '<h3>All apis:</h3>';
$apis = \App\Api::all();
foreach ($apis as $api) {
echo $api->name . '<br />';
}
//To list all credentials:
echo '<h3>All credentials:</h3>';
$credentials = \App\Credential::all();
foreach ($credentials as $credential) {
echo $credential->name . '<br />';
}
});
上記のダミーデータでは、screenshotとなります。
APIには、*ユーザー名、メールアドレス、電話番号*のいずれかが必要です。あるいはそれ以上のものが必要なのでしょうか?この 'api1_table'は一つのAPIのためのもので、次のAPIは独自のデータベーステーブルを持っていますか? –
これまでは、そのうちの1つを必要とするAPIのみを扱ってきました。 そして、それは私が 'apiN_table'のために考えていたものです –
これは良いアプローチではありません、imho、mysqlのようなリレーショナルデータベースを使うとき。 –