在CakePHP表单中创建查找字段

时间:2013-02-06 11:56:02

标签: php cakephp cakephp-2.1

我有一个使用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设置为值?

1 个答案:

答案 0 :(得分:2)

更新11-02-2013

首先,我强烈建议相应地转换主键和外键 这样他们就符合CakePHP的命名惯例。

这意味着:

  • DeviceID应为id
  • DeviceTypeID应为device_type_id
  • UserID应为user_id

表中的所有主键都应命名为id。 通过这种方式,您可以永远不必担心任何事情,包括您的模型等。

之后,您的所有表格必须为复数形式。这意味着device表应该是devices,因此您也应该重命名它。 我假设您还有以下表格:devices_typesusers

此时,我应该注意到我希望有一个名为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>菜单。

PS:你应该遵循关于模型命名等的CakePHP约定......我只是一个例子。