我有一个使用Bake创建的视图,其中包含以下内容:
<fieldset>
<legend><?php echo __('Edit Device'); ?></legend>
<?php
echo $this->Form->input('DeviceID');
echo $this->Form->input('DeviceTypeID');
echo $this->Form->input('UserID');
echo $this->Form->input('Type');
echo $this->Form->input('KeyPadID');
echo $this->Form->input('Version');
echo $this->Form->input('Description');
echo $this->Form->input('UpdateID');
?>
</fieldset>
保存到表中:
CREATE TABLE `device` (
`DeviceID` VARCHAR(255) NOT NULL ,
`DeviceTypeID` INT(11) NOT NULL ,
`UserID` INT(10) NOT NULL ,
`Type` VARCHAR(10) NULL DEFAULT NULL ,
`KeyPadID` INT(10) NULL DEFAULT NULL ,
`Version` VARCHAR(255) NULL DEFAULT NULL ,
`Description` TINYBLOB NULL ,
`UpdateID` INT(11) NULL DEFAULT NULL ,
PRIMARY KEY (`DeviceID`),
INDEX `FK_USER` (`UserID`),
INDEX `FK_devices_updates` (`UpdateID`),
INDEX `FK_device_devicetype` (`DeviceTypeID`),
CONSTRAINT `FK_device_devicetype` FOREIGN KEY (`DeviceTypeID`) REFERENCES `devicetype` (`DeviceTypeID`),
CONSTRAINT `FK_devices_updates` FOREIGN KEY (`UpdateID`) REFERENCES `update` (`ID`) ON UPDATE CASCADE ON DELETE CASCADE,
CONSTRAINT `FK_USER` FOREIGN KEY (`UserID`) REFERENCES `user` (`UserID`) ON UPDATE CASCADE ON DELETE CASCADE
)
我的问题是,当显示表单时,它显示DeviceTypeID和UserID以及UpdateID作为外键值而不是下拉列表,标题是文本,值是ID列。我如何将外部表中的字段设置为显示字段,将id设置为值?
答案 0 :(得分:2)
更新11-02-2013
首先,我强烈建议相应地转换主键和外键 这样他们就符合CakePHP的命名惯例。
这意味着:
DeviceID
应为id
。DeviceTypeID
应为device_type_id
UserID
应为user_id
表中的所有主键都应命名为id
。
通过这种方式,您可以永远不必担心任何事情,包括您的模型等。
之后,您的所有表格必须为复数形式。这意味着device
表应该是devices
,因此您也应该重命名它。
我假设您还有以下表格:devices_types
和users
。
此时,我应该注意到我希望有一个名为devicetype
的表。我避免使用强调名称,因为使用每个对象,类等的正确形式很容易出错。所以我不必担心是否应该使用CamelCase。
反正
您的Device
模型应该是这样的:
<?php
/** Device.php **/
class Device extends AppModel {
public $name = 'Device';
public $belongsTo = array(
'DeviceType' => array(
'className' => 'DeviceType',
'foreignKey' => 'device_type_id'
/** Specify other keys that meet your needs **/
),
'User' => array(
'className' => 'User',
'foreignKey' => 'user_id'
)
);
};
?>
此外,您的DeviceType
模型应与
<?php
/** DeviceType.php **/
class DeviceType extends AppModel {
public $name = 'DeviceType';
};
在edit()
方法中,您应该使用以下内容查询DeviceType
:
...
$devicetypes = $this->Device->DeviceType->find('list', array('id', 'caption'));
$this->set(compact('devicetypes'));
...
这种方式在您的视图中,相应的表单元素正确设置了<select>
菜单。