草庐IT

php - 可以插入HABTM数据但不能更新?

coder 2024-04-08 原文

什么不起作用

更新表单时,如果我更改复选框值,这些habtm 值不会保存到数据库

尽管在创建和更新表单中我使用了相同的方法:$this->Employee->save($this->data) 应该会自动处理 HABTM 数据。

什么有效

我已成功设置 HABTM 模型 遵循 this tutorial : Employees hasAndBelongsToMany Languages(即指定哪个员工说哪种语言)。

我可以创建关系:当使用创建表单创建新员工时,检查员工知道的任何语言并成功保存到数据库:员工转到员工数据库表, language 到 language 并且关系转到 employee_language 表。

在编辑表单上,我看到在创建员工时选中了哪些复选框

我发现(可能)有罪

在创建和更新员工时评估哪些数据进入数据库时​​,我发现 $this->data 变量结构不同。

在创建表单时(检查 2 种语言):

"$this->data"   Array [2]   
    Employee    Array [6]   
        name_lv John Doe    
        position_lv Computer administrator  
        enabled 0       
    Language    Array [1]   
        Language    Array [2]   
            0   1   
            1   5   

在更新表单上(选中其他语言,所以 3 种语言):

"$this->data"   Array [1]   
    Employee    Array [8]   
        name_lv John Doe    
        position_lv Computer administrator  
        Language    Array [3]   
            0   1   
            1   5   
            2   4   
        enabled 0   
        id  68  

请注意,现在可以在 $this->data["Employee"]["Language"] 下访问语言,这与创建 $this->data["Language"]<>

解决方法

如果我执行 $this->data["Language"] = $this->data["Employee"]["Language"]; 那么值会被保存(是的),除了employee_language HABTM 表中存在重复条目(哦,不)。

那么我应该切换哪个开关来使我的复选框可更新?

更多细节(如果你愿意的话)

(模型)employee.php

class Employee extends AppModel {
  var $name = "Employee";

  var $hasAndBelongsToMany = array (
    "Language" =>
        array(
            "className"     => "Language",
            "conditions"    => array(
                "Language.enabled" => "1"
            )
        )
  );
  ...
}

(模型)language.php:

class Language extends AppModel {

  var $name = "Language";
  ...
}

(查看)admin_create.ctp(这是创建表单。此代码段呈现所有可用语言的复选框):

...
<?php  
    echo $form->input('Language',array(
        'label' => 'Speaks in languages:',
        'type' => 'select',
        'multiple' => 'checkbox',
        'options' => $languages
));  ?>
...

(查看)admin_update.ctp(我可以看到我在创建员工时检查了哪些语言):

...
<?php  
    echo $form->input('Language',array(
        'label' => 'Speaks in languages:',
        'type' => 'select',
        'multiple' => 'checkbox',
        'options' => $languages,
        'selected' => $html->value('Employee.Language')
));  ?>
...

最佳答案

Mark 在评论中提供了解决问题的答案:

... you dont need to and you shouldnt use "selected" in your form input array.

是的,当我删除“selected”属性时,突然间我能够对 HABTM 数据进行更新。 所以现在我的输入控件看起来像:

<?php  
    echo $form->input('Language',array(
        'label' => 'Speaks in languages:',
        'type' => 'select',
        'multiple' => 'checkbox',
        'options' => $languages
));  ?>

没有办法将评论转换为答案,试图联系@mark 发表他的评论作为答案,但没有采取任何行动,我正在回答我自己的问题,以便其他人可以看到这个问题有一个解决方案。这就是 meta 上的建议:https://meta.stackexchange.com/questions/1555/mark-a-comment-as-answer-to-a-question/1558#1558

关于php - 可以插入HABTM数据但不能更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7256140/

有关php - 可以插入HABTM数据但不能更新?的更多相关文章

  1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  2. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  3. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  4. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  5. ruby - 我可以使用 Ruby 从 CSV 中删除列吗? - 2

    查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html

  6. ruby - 我可以使用 aws-sdk-ruby 在 AWS S3 上使用事务性文件删除/上传吗? - 2

    我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的

  7. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  8. ruby - 有人可以帮助解释类创建的 post_initialize 回调吗 (Sandi Metz) - 2

    我正在阅读SandiMetz的POODR,并且遇到了一个我不太了解的编码原则。这是代码:classBicycleattr_reader:size,:chain,:tire_sizedefinitialize(args={})@size=args[:size]||1@chain=args[:chain]||2@tire_size=args[:tire_size]||3post_initialize(args)endendclassMountainBike此代码将为其各自的属性输出1,2,3,4,5。我不明白的是查找方法。当一辆山地自行车被实例化时,因为它没有自己的initialize方法

  9. ruby - Ruby 有 `Pair` 数据类型吗? - 2

    有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

  10. ruby - 是否可以覆盖 gemfile 进行本地开发? - 2

    我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI

随机推荐