0

Cake を初めて使用し、モデルの関連付けを設定しようとしています。複数のチーム、つまり計画の基本単位が「イベント」である「グループ」で使用される実行プランナーを作成しています。各イベントは 1 つのチームによって所有されますが、多数のサポート チームを持つことができます。

コントローラーで $scaffold を使用すると、モデルの関連付けが期待どおりに機能し、新しいイベントを追加すると、イベントの所有者を選択するためのすべてのグループを含む選択ボックスが表示されます。ただし、コンソールを使用してコントローラーをベイクすると、選択ボックスgroup_idが空白になります。add()コントローラーとベイクされた追加ビューからベイクされたコードを含めました。も試しdebug($this)add.ctpみたところ、グループのリストが実際にビューに渡されていることがわかりました。したがって、$scaffold で機能する理由についてほとんど混乱していますが、それ以外の場合はそうではありません。

正しい方向へのアドバイスや指針をいただければ幸いです。

テーブル:

CREATE TABLE IF NOT EXISTS `events` (
  `id` int(5) NOT NULL AUTO_INCREMENT,
  `group_id` int(5) NOT NULL COMMENT 'Group that owns event',
  `version` int(5) NOT NULL,
  `type` varchar(5) NOT NULL,
  `stime` time NOT NULL,
  `etime` time NOT NULL,
  `description` text NOT NULL,
  `comment` text NOT NULL,
  PRIMARY KEY (`id`)
);

CREATE TABLE IF NOT EXISTS `events_groups` (
  `id` int(5) NOT NULL AUTO_INCREMENT,
  `event_id` int(5) NOT NULL,
  `group_id` int(5) NOT NULL,
  PRIMARY KEY (`id`)
) ;

CREATE TABLE IF NOT EXISTS `groups` (
  `id` int(5) NOT NULL AUTO_INCREMENT,
  `code` varchar(4) NOT NULL,
  `name` varchar(25) NOT NULL,
  `liveversion` int(4) NOT NULL,
  `lastupdated` date NOT NULL,
  PRIMARY KEY (`id`)
);

モデル:

イベント:

public $belongsTo = array(
    'Prigroup' => array(
        'className' => 'Group',
        'foreignKey' => 'group_id',
        )
    );


public $hasAndBelongsToMany = array(
    'Secgroup' => array(
        'className' => 'Group',
        'joinTable' => 'events_groups',
        'foreignKey' => 'event_id',
        'associationForeignKey' => 'group_id',
    )
);

グループ:

public $hasMany = array(
    'Prievent' => array(
        'className' => 'Event',
        'foreignKey' => 'group_id',
        )
    );

public $hasAndBelongsToMany = array(
    'Secevent' => array(
        'className' => 'Event',
        'joinTable' => 'events_groups',
        'foreignKey' => 'group_id',
        'associationForeignKey' => 'event_id',
    )
);

EventsController スニペット:

public function add() {
    if ($this->request->is('post')) {
        $this->Event->create();
        if ($this->Event->save($this->request->data)) {
            $this->Session->setFlash(__('The event has been saved'));
            $this->redirect(array('action' => 'index'));
        } else {
            $this->Session->setFlash(__('The event could not be saved. Please, try again.'));
        }
    }
    $prigroups = $this->Event->Prigroup->find('list');
    $secgroups = $this->Event->Secgroup->find('list');
    $this->set(compact('prigroups', 'secgroups'));
}

ビューを追加:

<?php echo $this->Form->create('Event'); ?>
    <fieldset>
        <legend><?php echo __('Add Event'); ?></legend>
    <?php
        echo $this->Form->input('group_id');
        echo $this->Form->input('version');
        echo $this->Form->input('type');
        echo $this->Form->input('stime');
        echo $this->Form->input('etime');
        echo $this->Form->input('description');
        echo $this->Form->input('comment');
        echo $this->Form->input('Secgroup');
    ?>
    </fieldset>
<?php echo $this->Form->end(__('Submit')); ?>

HTML出力を追加

<div class="input select"><label for="EventGroupId">Group</label><select name="data[Event][group_id]" id="EventGroupId">
</select></div>
4

1 に答える 1

1

何か試してもらえますか?$prigroups 変数の名前を「groups」に変更し、それをビューに渡します。これが機能しているかどうかを確認してください。それ以外の場合は、古いコードでこれを使用してください。

echo $this->Form->input(
    'group_id',
    array(
        'options' => $prigroups
    )
);

また、すべての PriGroup と SecGroup にキャメル ケースを使用することをお勧めします。これらは英語の 2 つの単語なので、キャメル ケースをお勧めします。

こんにちは func0der

于 2012-11-16T21:24:40.233 に答える