0

少し前に似たようなものをお願いしたのですが、今回はこれに気がついたので再度質問させていただきます。

この質問は単純に聞こえるかもしれませんが、私には向いていません。

私は2つのテーブルを持っています:

header (id,date,field1,field2) // This has One entry on the table
detail (id,idheader,field1,field2) // This can have multiple entries on the table

so ヘッダー (1) ---> 詳細 (N)

フォームを作成し、同じ $f->update() これら 2 つのテーブルを更新する最良の方法はどれですか?

請求書、予算など、さまざまなことが考えられると想像してみてください。

どうもありがとう

4

2 に答える 2

1

論理モデルは物理的に 2 つのテーブルに配置されているようです。まず、どのテーブルが「プライマリ」であるかを決定します。どちらの方法でもかまいません。次のモデルを作成して、「ヘッダー」テーブルをプライマリにします。

class Model_Header extends Model_Table {
    public $table='header';
    function init(){
        parent::init();

        $this->addField('date')->type('date');
        $this->addField('field1');
        $this->addField('field2');
    }
}

次に、それを 2 番目のテーブルと結合し、そこからフィールドを追加する必要があります。$model->join() を呼び出すと、「SQL_Relation」オブジェクトが返されます。これを使用して、フィールドを追加し、さらに結合を作成できます。新しいオブジェクトを作成するか、既存のオブジェクトを拡張できます。

class Model_Record extends Model_Table {
    public $table='header';
    function init(){
        parent::init();

        $this->addField('date')->type('date');
        $this->addField('field1');
        $this->addField('field2');

        $detail = $this->join('detail.idheader');
        $detail->addField('body');


        $details->addField('body_field1','field1');
    }
}

両方のテーブルが同じフィールドを定義し、モデルには一意のフィールドが必要であるため、detail.field1 に新しい名前を定義しました。また、結合に使用するフィールド (idheader) を明示的に指定しました。次に、他のモデルと同じように新しいモデルを使用します。

$form=$this->add('Form');
$form->setModel('Model_Record');
$form->onSubmit(function($form){
    $form->update()->js()->successMessage('success!')->execute();
});
于 2012-05-27T13:33:21.453 に答える
0

従来のアプローチは、「ヘッダー」を含むグリッドを作成し、列エキスパンダーを追加することです。これにより、「詳細」を含むグリッドが表示され、モデル「詳細」には setMasterField("idheader", $_GET["header_id"]); が含まれます。

例えば

class page_test extends Page {
    function initMainPage(){
        $g = $this->add("Grid"); // or CRUD
        $g->setModel("header");
        $g->addColumn("expander", "details");
    }
    function page_details(){
        $this->api->stikcyGET("header_id");
        $g = $this->add("Grid"); // or CRUD
        $m = $this->add("Model_detail")->setMasterField("idheader", $_GET["header_id"]);
        $g->setModel($m);

    }
}

未検証。

于 2012-05-27T10:51:06.353 に答える