前段时间我曾要求类似的东西,但现在我正在接受这个,所以再问一遍。
也许这个问题听起来很简单但不适合我。
我有两张桌子:
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
所以标题(1)--->细节(N)
这可能是制作表单并在同一$ f-> update()这两个表上更新的最佳方法吗?
想象一下,这可能是很多事情:发票,预算等等
非常感谢
答案 0 :(得分:1)
看起来您的逻辑模型实际上位于两个表中。首先,确定哪个表是“主要的”,它可以是任何一种方式。我将通过创建以下模型使“header”表成为主要的:
class Model_Header extends Model_Table {
public $table='header';
function init(){
parent::init();
$this->addField('date')->type('date');
$this->addField('field1');
$this->addField('field2');
}
}
接下来,您需要将其与第二个表连接并从中添加字段。当你调用$ 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();
});
答案 1 :(得分:0)
传统的方法是使网格带有“标题”并添加列扩展器,其中显示带有“细节”的网格,而模型“详细信息”则带有setMasterField(“idheader”,$ _GET [“header_id”]);
e.g。
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);
}
}
未经测试。