0

私は codeigniter に基づいて診療所管理/患者電子記録プロジェクトを構築していましたが、データベース間に多くの関係があるため、orm を使用することにしました。

そこで、datamapper 1.8.2 をダウンロードして、新しい codeigniter プロジェクトを開始しました。最初に気づいたのは読み込み時間です。

codeigniter のウェルカム ページが 1 秒で読み込まれます ++ ! まだロジックなしで!これは正常ですか?それは受け入れられますか?通常、私のマシンでは ci は 0.002 秒でロードされますが、datamapper または 1.06 が最適です。

2番目の質問は関係についてです。

たとえば、2つのテーブルがあります

表 1 ユーザー . 私はすべてのオフィスの従業員を保存するために使用し、そこに役割があります

例(ユーザー)

|ID|name|role   |
|1 |Demo|admin  |
|2 |Demo|doctor |
|3 |Demo|nurse  |
|4 |Demo|patient|

2 番目の表は訪問数です

|id|doctor_id|patient_id|.....
|1 |2        |4         |......

has_one(doctors,patient)では、データマッパーがユーザーの各ユーザーに役割があり、そのテーブルの訪問とユーザー(医師、患者)を理解できるようにするにはどうすればよいhas_many(visits)ですか? すべての訪問には医師と患者が 1 人しかいないため、すべての患者/医師は何度も訪問することができます。

現在の設定トライアル

class Visit extends DataMapper {
    var $has_one = array(
        'doctor' => array(
            'class' => 'user',
            'join_self_as' => 'doctor_id',
            'other_field' => 'visit'
        ),
        'patient' => array(
            'class' => 'user',
            'join_self_as' => 'patient_id',
            'other_field' => 'visit'
        )
    );
    var $has_many = array();

ユーザー

class User extends DataMapper {
    var $has_one = array();
    var $has_many = array(
        'visit' => array(
            'class' => 'visit',
            'other_field' => 'doctor_id',
            'join_self_as' => 'doctor_id',
        )
    );

しかし、私が医者の訪問にアクセスしようとすると

$u=new user(2);
$u->visit->get();

それは私にエラーを与える

DataMapper Error: 'doctor_id' is not a valid parent relationship for Visit. Are your relationships configured correctly?

ヘルプ ?!

4

2 に答える 2

1

ORM の有無にかかわらず、開発者は使用するツールを常に意識する必要があります。この場合は、DB で実行されるクエリを生成するために記述するコードを意識する必要があります。クエリが進むにつれて、可能な場合は複数のクエリの代わりに結合を使用して、Datamapper は最も効率的です。

Datamapper によって生成されたクエリを確認するには、CI のプロファイラーを有効にします。コードが効率的かどうか、または実行する必要があるよりも多くのクエリを実行するかどうかがすぐにわかります。

本番キャッシュを有効にしましたか? そうでない場合、Datamapper はロードするすべてのモデル、すべてのページ リクエストに対して DESCRIBE TABLE を実行します。これは開発中 (テーブル構造がまだ変更されている場合) には問題ありませんが、本番環境では良い考えではなく、おそらくその時間の大部分を占めるでしょう。

于 2013-02-23T20:13:32.597 に答える
0

あなたの関係は正しく定義されていません:

class Visit extends DataMapper {
    var $has_one = array(
        'doctor' => array(
            'class' => 'user',
            'join_self_as' => 'doctor',
        ),
        'patient' => array(
            'class' => 'user',
            'join_self_as' => 'patient',
        )
    );


class User extends DataMapper {
    var $has_many = array(
        'visit' => array(
            'join_other_as' => 'doctor',
        )
    );

デフォルト以外の値をオーバーライドするだけでよく、残りは Datamapper が埋めてくれます。また、「_id」サフィックスは使用しないでください。これは必須であり、Datamapper によって自動的に追加されます。

Visit の場合、リレーションで使用される FK を指定して、それ自体の「id」を表す必要があります。これは、「doctor」リレーションの場合は「doctor_id」、「patient」リレーションの場合は「patient_id」になります。

ユーザーの場合、他のテーブルの FK が「visit_id」(デフォルト) ではなく、「doctor_id」であることを伝える必要があります。

于 2013-04-11T10:37:09.673 に答える