0

私はmysqlで複数のテーブルを使用することにかなり慣れていないので、いくつかのことを本当に理解していません..

これが私の .php からの私の php コードですrole.model.php

public function getRolePerms($role_id) {

    $str = "SELECT t2.perm_desc FROM role_perm as t1
    JOIN permissions as t2 ON t1.perm_id = t2.perm_id
    WHERE t1.role_id = :role_id";

    $sth = $this->db->prepare($str);
    $sth->execute(array(':role_id' => $role_id));

    $data = $sth->fetchAll(PDO::FETCH_ASSOC);
    print_r($data);
}

私はrole.phpコントローラーでそれを呼び出し、ダミー$role_idに 1 を与えました。getRolePerms(1);

print_r($data)はそれがデータをフェッチするかどうかを知っていますが、出力はただです

"配列()"

私の質問は、これはどのように機能するのですか?

これらのテーブルがある場合:

roles
permissions
role_perms

role_idおよび列を使用しperm_idて、役割と権限の主キーを参照します。

ちょっと混乱。誰かが本当に簡単な言葉で私に説明できますか?

4

2 に答える 2

3

role_permsaが1の行があるかどうかをテーブルで確認しましたrole_idか?クエリが機能する必要があるためです。

これはどのように作動しますか?

まず、テーブルとその関係を理解し​​てみてください。あなたのテーブルは次のテーブルのようなものだと思います。

ROLEテーブルには、アプリケーション内の役割(Admin、Guestなど)が含まれています。

Table 1: ROLE
-----------------------------------------------
  role_id        role_description
-----------------------------------------------
     1               Admin
     2               Guest

PERMISSIONSテーブルには、アプリケーションの権限が含まれています。

Table 2: PERMISSIONS
-----------------------------------------------
  permission_id        permission_description
-----------------------------------------------
     1                 Can create files
     2                 Can edit files
     3                 Can view files

ROLE_PERMISSIONSテーブルには、アプリケーションのさまざまなロールの権限が含まれています以下のデータを例にとると、役割1(管理者)には権限1、2、および3(それぞれファイルの作成、編集、表示が可能)があることを意味します。

Table 3: ROLE_PERMISSIONS
-----------------------------------------------
  role_id        permission_id
-----------------------------------------------
     1                1
     1                2
     1                3
     2                3

ここで、クエリを理解してみてください。

SELECT t2.permission_description
FROM role_permissions as t1 JOIN permissions as t2
ON t1.permission_id = t2.permission_id
WHERE t1.role_id = 1

最初の行は、取得するデータを示していますt2列のテーブルから値を選択するように指示されていますpermission_description。したがって、クエリの結果は次のようになります。

ファイルを作成できますファイルを
編集できますファイル
を表示できます

2行目と3行目は、データを取得する場所を示しています。role_permissionspermissions ON条件の結合テーブルからデータを取得するように指示されています。

t1.permission_id = t2.permission_id

注: AS エイリアスが使用されることを示します。意味 t1 は、と同じ role_permissionsです。

上記のPERMISSIONSテーブルとROLE_PERMISSIONSテーブルから、ジョイントテーブルは次のようになります。

Table 4: Joint ROLE_PERMISSIONS and PERMISSIONS
------------------------------------------------------------------------
  role_id    permission_id    permission_id    permission_description
------------------------------------------------------------------------
     1             1               1              Can create files
     1             2               2              Can edit files
     1             3               3              Can view files
     2             3               3              Can view files

これは、データが取得されるテーブルです。

permission_descriptionこれまでのところ、命令はジョイントテーブル(表4 )からを取得することです。

4行目は、最初の命令に制約を追加して、permission_descriptionsのみを選択しますWHERE role_id = 1。したがって、完全な命令は次のとおりです。

permission_descriptionが1であるジョイントテーブル(表4)からsを取得しますrole_id

平易な英語でこれは意味します:

ロール「管理者」の権限の説明を取得します。

したがって、クエリの結果は次のようになります。

Table 5: PERMISSION_DESCRIPTIONS of Admin
-----------------------------------------------
  permission_description
-----------------------------------------------
     Can create files
     Can edit files
     Can view files

これがお役に立てば幸いです。

于 2012-07-22T09:55:53.237 に答える
0
SELECT t2.perm_desc FROM role_perm as t1
JOIN permissions as t2 ON t1.perm_id = t2.perm_id
WHERE t1.role_id = :role_id;

このコマンドは、MySQL に role_perm とパーミッションを共有列 (perm_id) で結合するように指示します。これは正しいです。しかし、これら 2 つのテーブルのロール ID 間の接続が失われています。role_perm.role_id が正しい role_id を指しているかどうかに関係なく、結合により、perm_id が role_perm テーブルにも存在する権限テーブルの列を含む 1 つのテーブルが作成されます。where 句は t1 のみをフィルタリングします。これにより、他の役割も持つ権限を取得する可能性があります。これを解決するには、SQL コマンドを次のように変更します。

SELECT t2.perm_desc FROM role_perm as t1
JOIN permissions as t2 ON t1.perm_id = t2.perm_id AND t1.role_id=t2.role_id
WHERE t1.role_id = :role_id;
于 2012-07-22T06:16:04.617 に答える