【问题标题】:Form input and save multiple records in a hasMany through model表单输入并将多条记录保存在 hasMany through 模型中
【发布时间】:2015-01-30 12:54:19
【问题描述】:

我使用的是 cakephp 2.6

我已经设置了3个表如下(简化):

带有 id、fname、lname、电话的“people”表...
带有 id、skillname 的“技能”表。
带有 id、person_id、skill_id、score 的“people_skills”表

我在技能表中列出了 18 项技能,例如法律、IT、筹款等,用户可以为每项技能打分 1、2 或 3。

我相信模型设置正确,因为我可以执行 $this->PeopleSkill->find('all') 并且我的视图很高兴地显示了一个表格,其中包含正确的人名行,技能名称,以及他们在该技能上的得分。

我正在尝试创建一个显示一个人并列出所有 18 项技能的表单,每个技能的单选按钮分别对应分数 1、2 或 3,以便快速填写 1 人的每项技能的分数。

提交将向数据库写入 18 行,每行将包含 person_id(所有人都相同)、一个 Skill_id 以及该技能的相应分数。

我是 cakephp 新手,有时我仍然无法使用 form/mysql 魔法,这让我想恢复到原始的 php 循环和 mysql 调用。但我认为学习蛋糕的方法会更好。

我目前失败的实验让我遍历技能列表并尝试逐行构建表格,但我很确定我完全走错了方向,因为正确的表格应该可以保存行动更容易。

今晚我一直在研究 saveMany 方法,但我不知道如何构建表单以创建适当的数组,以及如何最好地保存它。我需要创建某种保存循环吗?

如果您需要查看我的模型、控制器或视图的某些部分,请告诉我,我会很乐意分享您想看的任何内容。

非常感谢您的帮助。

【问题讨论】:

  • 请输入您目前尝试过的一些代码。
  • 是所有插入的结果还是 MySQL 的插入和更新的混合?
  • 如果 cakephp 的魔法可以让插入或更新变得容易,就像在我的一些更简单的形式中一样,那就太好了,但首先我很高兴能够进行所有插入。我已经添加了我当前的控制器和查看代码以供参考。

标签: cakephp


【解决方案1】:

谢谢。这让我更进一步。我需要将最后一个“隐藏”更改为“输入”,或者我只是得到一个空屏幕。

在第一个表单输入行,我将 $person['Person']['id'] 更改为 $skill['Person']['id'] 以解决 $people 未定义的错误。我认为这行得通,但也许我应该在控制器中设置 $people 变量。

这可能与我的另一个问题有关,即为 1 人设置所有这些分数。如果我在控制器中使用$skills = $this->PeopleSkill->find('all') 设置$skills,那么我的表单会显示多个重复技能。如果在控制器中将 $skills 设置为 $skills = $this->PeopleSkill->find('all',array('conditions' => array('person_id' => $directorid))),并将人员 ID 作为 $directorid 传递,那么我会得到一个表单,仅显示已为该人输入的技能,没有选择,提交它们会添加一整套重复项条目。

现在我可以不编辑以前的数据,如果我可以在表格中指明一个特定的人 ID 并获得一套完整的技能并将它们全部作为新的提交,那就太好了。

供您参考,这是我的控制器和视图文件。

控制器

public function customadd($directorid = null) {
    $testdate = date('Y-m-d');
    $this->set('testdate', $testdate);

    $skills = $this->PeopleSkill->find('all',array('conditions' => array('person_id' => $directorid)));
    $this->set('skills', $skills);
    $this->set('directorid', $directorid);

        if ($this->PeopleSkill->saveMany($this->request->data('PeopleSkill'))) {
                $this->redirect(array('action' => 'index'));
            }
        }

还有风景

<?php
$scorelevel = array(
    '1' => '1',
    '2' => '2',
    '3' => '3'
    );

echo $this->Form->create('PeopleSkill');

foreach ($skills as $key => $skill) {
    echo $this->Form->hidden('PeopleSkill.'.$key.'.person_id',array('value'=>$skill['Person']['id']));
    echo "[Debug] Current peson is: ".$skill['Person']['fname'];
    echo $this->Form->hidden('PeopleSkill.'.$key.'.skill_id',array('value'=>$skill['Skill']['id']));
    echo $this->Form->input('PeopleSkill.'.$key.'.score',array('type'=>'radio', 'options'=>$scorelevel,'legend'=>$skill['Skill']['skill']));
}
echo $this->Form->end('Submit');
// print_r($skills);
?>

这会产生一个表格,仅显示已在数据库中填写值的技能。

【讨论】:

    【解决方案2】:

    我假设添加了人员和技能

    <?php
    echo $this->Form->create('PeopleSkill');
    $score_list = array(
    '1' => '1',
    '2' => '2',
    '3' => '3'
    );
    foreach($skills as $key => $skill) {
        echo $this->Form->hidden('PeopleSkill.'.$key.'.person_id',array('value'=>$person['Person']['id']));
        echo $this->Form->hidden('PeopleSkill.'.$key.'.skill_id',array('value'=>$skill['Skill']['id']));
        echo $this->Form->input('PeopleSkill.'.$key.'.score',array('type'=>'radio','options'=>$score_list,'legend'=>$skill['Skill']['name']));
    }
    
    echo $this->Form->end('Submit');
    ?>
    

    在你的控制器中

    $this->PeopleSkill->saveMany($this->request->data['PeopleSkill']);
    

    用于更新技能

    在你的控制器中

    public function customadd($directorid = null) {
    
    if($this->request->is('post')) {
        if ($this->PeopleSkill->saveMany($this->request->data('PeopleSkill'))) {
            $this->redirect(array('action' => 'index'));
        }
    }
    
    $testdate = date('Y-m-d');
    $this->set('testdate', $testdate);
    
    $person = $this->Person->findById($directorid);
    $people_skills = $this->PeopleSkill->find('all',array('conditions' => array('person_id' => $directorid)));
    $this->set(compact('person'));
    $this->set(compact('people_skills'));
    }
    

    在你看来

    Current Person : <?php $person['Person']['name']; ?>
    <?php
    $scorelevel = array(
        '1' => '1',
        '2' => '2',
        '3' => '3'
        );
    
    echo $this->Form->create('PeopleSkill');
    
    foreach ($people_skills as $key => $skill) {
        echo $this->Form->hidden('PeopleSkill.'.$key.'.id',array('value'=>$skill['PeopleSkill']['id']));
        echo $this->Form->hidden('PeopleSkill.'.$key.'.person_id',array('value'=>$skill['PeopleSkill']['person_id']));
        echo $this->Form->hidden('PeopleSkill.'.$key.'.skill_id',array('value'=>$skill['PeopleSkill']['skill_id']));
        echo $this->Form->input('PeopleSkill.'.$key.'.score',array('type'=>'radio', 'options'=>$scorelevel,'legend'=>$skill['Skill']['skill'],'value'=>$skill['PeopleSkill']['score']));
    }
    echo $this->Form->end('Submit');
    ?>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-27
      • 2023-03-29
      相关资源
      最近更新 更多