0

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
)

私の問題は、フォームが表示されると、キャプションがテキストで値が ID 列であるドロップダウンではなく、DeviceTypeID と UserID、および UpdateID が外部キー値として表示されることです。外部テーブルのフィールドを表示フィールドに設定し、id を値に設定するにはどうすればよいですか?

4

1 に答える 1

2

2013 年 11 月 2 日更新

まず第一に、主キーと外部キーを適切に変換して、CakePHP の命名規則を満たすようにすることを強くお勧めします。

この意味は:

  • DeviceIDする必要がありますid
  • DeviceTypeIDする必要がありますdevice_type_id
  • UserIDする必要がありますuser_id

また、テーブル内のすべての主キーの名前はid. このようにして、モデルなどについて何も心配する必要はありません。

その後、すべての表は複数形でなければなりません。これは、deviceテーブルが である必要があることを意味するdevicesため、名前も変更する必要があります。次のテーブルもあると仮定します:devices_typesおよびusers.

この時点で、 という名前のテーブルを使用したいことに気付くはずdevicetypeです。各オブジェクト、クラスなどに正しい形式を使用すると間違いを犯しやすいため、下線付きの名前は避けます。したがって、キャメルケースを使用する必要があるかどうかを心配する必要はありません。

ともかく

モデル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 の規則に従う必要があります。私のものは単なる例です。

于 2013-02-06T13:39:11.187 に答える