我在CakePHP中构建了许多具有编辑(更新)功能的应用程序。我遇到了一个前所未有的问题,即使从数据库返回数据并且字段名称匹配,Cake也不会填充一组表单字段。
在Controller方法中,我正在获取数据:
public function edit()
{
$invno = '1234'; // This is dynamic from the URL but is here for the example
$TblInvoicestobepaid = TableRegistry::getTableLocator()->get('TblInvoicestobepaid');
$data = $TblInvoicestobepaid->find()->where(
['invno' => $invno]
);
if (!$data->isEmpty()) {
$data = $data->first();
}
}
如果我执行debug($data);
,则可以看到该数据是从数据库返回的,并且是一个对象:
object(App\Model\Entity\TblInvoicestobepaid) {
'invno' => '1234',
'amount' => '1090',
'vat' => '218',
'total' => '1308',
'orgname' => 'Test Company',
}
然后我使用$this->set(compact('data'));
将此数据传递到我的模板。这似乎与其他Controller edit()
方法(包括已烘焙的方法)相同。
我正在使用表单帮助器,并且字段名称与上面对象中的键匹配,例如
<?php echo $this->Form->create(); ?>
<?php echo $this->Form->text('invno'); ?>
<?php echo $this->Form->text('amount'); ?>
<?php echo $this->Form->text('vat'); ?>
<?php echo $this->Form->text('total'); ?>
<?php echo $this->Form->text('orgname'); ?>
<?php echo $this->Form->end(); ?>
呈现了表单,但字段为空。
我注意到的一件事是,这是一个遗留应用程序,从中获取此数据的表没有id
字段。主键是invno
,这是一个字符串(MySQL中的varchar
)。但这已在Table类中定义:
// src/Model/Table/TblInvoicestobepaidTable.php
public function initialize(array $config)
{
parent::initialize($config);
$this->setTable('tbl_invoicestobepaid');
$this->setDisplayField('invno');
$this->setPrimaryKey('invno');
}
通过Controller中的add()
方法插入数据没有任何问题。但是当涉及到编辑时,并没有填充表格,我也不明白为什么。
CakePHP版本为3.8.12