2

我正在尝试使用 Profiles 和 Qualifications 表之间的 HABTM 关联。

型号:Profile.php

App::uses('AppModel', 'Model');
class Profile extends AppModel {
  public $hasAndBelongsToMany = array(
    'Qualification' => array(
    'className' => 'Qualification',
    'joinTable' => 'profile_qualifications',
    'foreignKey' => 'profile_id',
    'associationForeignKey' => 'qualification_id',
    'unique' => 'keepExisting'
    )
  );
}

型号:Qualification.php

App::uses('AppModel', 'Model');
class Qualification extends AppModel {
  public $hasAndBelongsToMany = array(
    'Profile' => array(
    'className' => 'Profile',
    'joinTable' => 'profile_qualifications',
    'foreignKey' => 'qualification_id',
    'associationForeignKey' => 'profile_id',
    'unique' => 'keepExisting',
    )
  );
}

控制器:ProfilesController.php

App::uses('AppController', 'Controller');
class ProfilesController extends AppController {
  public function edit() {
    $this->Profile->id = $this->Auth->user('profile_id');
    if ($this->request->is('post') || $this->request->is('put')) {
      if ($this->Profile->save($this->request->data)) {
        $this->Session->setFlash(__('The profile has been saved'));
        $this->redirect(array('action' => 'view'));
      } else {
        $this->Session->setFlash(__('The profile could not be saved. Please, try again.'));
      }
    } else {
      $this->request->data = $this->Profile->read(null, $this->Auth->user('profile_id'));
    }
    $salutations = $this->Profile->Salutation->find('list', array('fields' => array('Salutation.id', 'Salutation.abbr_name')));
    $qualifications = $this->Profile->Qualification->find('list', array('fields' => array('Qualification.id', 'Qualification.abbr_name')));
    $this->set(compact('salutations', 'qualifications'));
  }
}

查看:edit.ctp

<div class="profiles form">
<?php echo $this->Form->create('Profile'); ?>
  <fieldset>
    <legend><?php echo __('My Profile'); ?></legend>
<?php
  echo $this->Form->input('salutation_id');
  echo $this->Form->input('first_name');
  echo $this->Form->input('middle_name');
  echo $this->Form->input('last_name');
  echo $this->Form->input('qualification'); /* gives drop down not multi select */
  echo $this->Form->input('bio');
  echo $this->Form->input('email');
  echo $this->Form->input('mobile');
  echo $this->Form->input('phone');
?>
</fieldset>
<?php echo $this->Form->end(__('Submit')); ?>
</div>

因此生成的编辑视图包含下拉菜单,可以一次选择一个值作为 Qualifications 属性。

我想知道如何为资格生成带有多值选择框的视图?此外,我的代码现在有什么错误?

4

3 回答 3

3

第一次发帖,老用户。

我今天偶然发现了这个问题,并最终使用了确实很好用的后续解决方案。然而,我让自己想知道“为什么 CakePHP 不能正确地处理 HABTM 关系?” 特别是考虑到(至少在我的情况下)大多数文件都是在蛋糕控制台中烘焙的。

如果我们更深入地研究这个问题,我们会发现这个问题实际上很简单。仔细看一下这个片段,PostsController.php揭示了 Cake 如何构建与函数的 HABTM 关系,并使用$this->set()它来将其传递给视图(重要:使用小写复数版本“salutations”):

$salutations = $this->Profile->Salutation->find('list', array('fields' => array('Salutation.id', 'Salutation.abbr_name')));
$qualifications = $this->Profile->Qualification->find('list', array('fields' => array('Qualification.id', 'Qualification.abbr_name')));
$this->set(compact('salutations', 'qualifications'));

根据Cake Cook Book,为了在使用表单助手时在前端利用这个HABTM,需要以单数形式和标题大小写指定变量(即:“Salutation”)

烹饪书中的片段:

假设用户 hasAndBelongsToMany 组。在您的控制器中,使用选择选项设置一个 camelCase 复数变量(在本例中为 group -> groups,或 ExtraFunkyModel -> extraFunkyModels)。在控制器操作中,您将输入以下内容:

$this->set('groups', $this->User->Group->find('list'));

在视图中,可以使用以下简单代码创建多项选择:

echo $this->Form->input('Group');

无需任何必要的现场调整即可解决您的问题。

干杯!

继续烤。

于 2013-05-25T23:15:12.960 回答
2

也许您需要进一步配置您的输入:

echo $this->Form->input('Qualification',array(
    'label' => 'Qualifications',
    'type' => 'select',
    'multiple' => true, // or 'checkbox' if you want a set of checkboxes
    'options' => $qualifications,
    'selected' => $html->value('Qualification.Qualification'),
));

每当我遇到 HABTM 协会时,我都会使用这篇博文。在我看来,默认情况下可能需要一组复选框而不是选择输入 - 也许有更深入的 CakePHP 洞察力的人可以在这里加入?

于 2013-05-04T18:25:33.120 回答
0

改变

echo $this->Form->input('qualification');

echo $this->Form->input('qualification', array(
    'multiple' => true
));

CakePHP 手册有更多关于表单助手输入选项的信息。

于 2013-05-04T18:37:11.637 回答