0
table1(users)
|ID|name  |type  |
|1 |demo  |admin |
|2 |demoX |client|

table2(visits)
|ID|admin_id|visitor_id|visit_date|...
|1 |1       |2         |2013-01-01|...
admin(fk)->users(id)
user(fk)->users(id)

単純なスケジューラプロジェクトで、2つのテーブルが含まれています。

1番目(ユーザー)にはすべてのユーザーが含まれ、2番目のテーブルにはすべての予約(訪問)が含まれます。

私が実行する管理者のすべての予約を取得し Select * from visits where admin_id=$id;、ユーザーテーブルから訪問者情報に参加します。

........ だから基本的に、

すべての管理者は多くの訪問を持つことができます

訪問には、(ONE)adminと(ONE)visitorが含まれている必要があります。

datamapper ormでこの種の関係を設定するにはどうすればよいですか?

4

2 に答える 2

0

これはそれを行う必要があります:

class Users extends Datamapper
{
    public $has_many = array(
        'admin' => array(
            'class' => 'users',
            'other_field' => 'admin', // FK = admin_id
        ),
        'visitor' => array(
            'class' => 'users',
            'other_field' => 'visitor', // FK = visitor_id
        ),
    );
}

class Visits extends Datamapper
{
    public $has_one = array(
        'admin' => array(
            'class' => 'users',
            'join_self_as' => 'admin', // FK = admin_id
        ),
        'visitor' => array(
            'class' => 'users',
            'join_self_as' => 'visitor', // FK = visitor_id
        ),
    );
}

// then in your controller you can do:

$visit = new Visitor(1);
echo $visit->admin->name; // echo's 'demo';
echo $visit->visitor->name; // echo's 'demoX';
于 2013-02-07T20:48:46.343 に答える
0

まず第一に、andを使用したテーブルを作成する代わりにadmin_iduser_id役に立たない)、とを使用して別のテーブルを作成する必要があると思いますusersprivilegesそうすると、テーブル構造は次のようになります。

    Users                                   privileges
| id |  user  | privilege_id |             | id | privilege |
| 1  | user1  |    1         |             | 1  |   user    |
| 2  | admin1 |    2         |             | 2  |   admin   |

次に、アプリケーション内でユーザーレベルを呼び出す場合は、次のようにします。

SELECT privilege FROM privileges WHERE id = <privilege_id from users table which should already be set within your code>(MySQL)

ALWAYSこの目的のためにテーブルにを設定する必要がidあります。これは、別のテーブルからデータを収集するときの関係データの基礎になるため、この例では次のようになります。the <id> field of the privileges table and the <privilege_id> of the users table.

ここから、このメソッドをDatamappercodeigniter、または誤解を招くタグが意味するものに転送できるはずです=]


SELECTデータベースから予約する必要がある場合は、 booking(追加の表を作成して以下のように追加)を選択し、予約の時刻を((privilage_id == 1) && (privilage_id == 2))探します。これにより、単にではなく、管理者とユーザーの両方がいる日付が検索されます。 1つのユーザータイプを見ると、それらすべてを見ることができます。また、複数の列ではなく1つの列を呼び出すことで、面倒な作業を省くことができます。また、この方法では、テーブルの名前が関数に関連しているため、テーブルを簡単に管理できます。

         Users                        privileges           booking
| id |  user  | privilege_id |  | id | privilege |     | id | date |   privilege_id | 
| 1  | user1  |    1         |  | 1  |   user    |     | 1  |5/2/13|      1         |  
| 2  | admin1 |    2         |  | 2  |   admin   |     | 2  |5/2/13|      2         | 

したがって、MySQLはSELECT date FROM booking WHERE ((privilege_id == 1) && (privilege_id == 2))、期待する結果を提供します。データをサニタイズしてテーブルに入れる必要がある場合は、このような手順で1つのデータベースに2つの行を作成する必要があります(これは例では、架空の記入済み予約フォームを使用します(PHPで実行されます)):

if((isset($user) && (isset($usertype)) && (isset($usertypetwo)) && (isset($date)))
{
    if(($usertype != $usertypetwo))
     {
      "Insert BLAH BLAH"
     }
}

また、このメソッドを使用すると、ユーザーテーブルからユーザータイプを取得して、privilege_id

于 2013-02-05T11:04:34.897 に答える