0

クライアント、タスク、タスクステータス(各クライアントのタスクを照合するため)の3つのモデルがあります。
Model_Task

protected static $_properties = array(
        'id',
        'name',
        'created_at',
        'updated_at',
    );

Model_Client

protected static $_properties = array(
        'id',
        'name',
        'created_at',
        'updated_at',
    );

Model_Taskstatus

protected static $_properties = array(
        'id',
        'client',
        'task',
        'created_at',
        'updated_at',
    );

Model_Taskに以下を追加しました

protected static $_has_many = array(
        'taskstatuses' => array(
            'key_from' => 'id',
            'model_to' => 'Model_Taskstatus',
            'key_to' => 'task',
            'cascade_save' => true,
            'cascade_delete' => false,
        )
    );

Model_Client

protected static $_has_many = array(
        'taskstatuses' => array(
            'key_from' => 'id',
            'model_to' => 'Model_Taskstatus',
            'key_to' => 'client',
            'cascade_save' => true,
            'cascade_delete' => false,
        )
    );

Model_Taskstatus

protected static $_belongs_to = array(
        'client' => array(
            'key_from' => 'client',
            'model_to' => 'Model_Client',
            'key_to' => 'id',
            'cascade_save' => true,
            'cascade_delete' => false,
        ),
        'task' => array(
            'key_from' => 'task',
            'model_to' => 'Model_Task',
            'key_to' => 'id',
            'cascade_save' => true,
            'cascade_delete' => false,
        )
    );

taskstatusがクライアントフィールドをクライアントモデルにリンクし、タスクフィールドをタスクモデルにリンクしたいのですが、ユーザーがクライアントまたはタスクモデルにない値のタスクを(id経由で)挿入すると、エラーが表示されます。ただし、機能しません(clientstatusに、クライアントテーブルとタスクテーブルに存在しないクライアントのIDとタスクのIDの値を追加できます。

4

1 に答える 1

1

Model Conventionに固執する場合、以下は問題なく機能します。

class Model_Task extends \Orm\Model
{
    protected static $_belongs_to = array(
        'client'
    );

    protected static $_properties = array(
        'id',
        'name',
        'client_id',
        'created_at',
        'updated_at'
    );
}

class Model_Client extends \Orm\Model
{
    protected static $_has_many = array(
        'task'
    );

    protected static $_properties = array(
        'id',
        'name',
        'created_at',
        'updated_at'
    );
}

クライアントのタスクを取得するには、次のことを行うだけです。

$client = Model_Client::find(1);

foreach($client->task as $task)
{
    /* do something with each $task */
}

編集: そうすれば、クライアント/タスク間に不要なテーブル/モデルを持たないようにし、既存のクライアントに有効なタスクを追加する必要があります。さらに、クライアント/タスク間の1対多の関係が必要な場合、Model_Taskstatus を使用すると、同じタスクを異なるクライアントに割り当てることができますが、これは望ましくありません。

Has Many のドキュメントを確認してください。

于 2012-12-09T14:25:34.833 に答える