【问题标题】:How do I add multiple entries to a database with one yii form?如何使用一个 yii 表单向数据库添加多个条目?
【发布时间】:2015-06-22 23:26:39
【问题描述】:

我正在尝试在 yii 中为需要与所述项目关联的标签的项目构建一个创建表单。为了这个问题,我设置了三个表来处理这个问题。表:items、tags(都有唯一的 ID 和名称)和 item_tag_relation(包含 2 个 ID)以及必要的模型、控制器和视图都已创建。

到目前为止,所有这些都在正常工作。如果需要,我可以转到 item/create、tag/create 和 itemTagRelation/create 并单独创建每个部分。但是,我希望所有三个都放在一个页面下。在此页面上,我希望能够将可变数量的标签输入到由空格分隔的文本字段中,并让表单在保存项目的同时保存标签及其关系。很像 stackoverflow 问题创建页面,现在我看了一下。为此,我得到了这个 JavaScript 框 MagicSuggest 半工作。

问题是我无法获取要从数据库加载或保存到数据库的标签。我知道我可以使用 ItemController 将多个模型传递给视图,但是如何加载和保存可变数量?是否有某种 yii 标准方法可以一次构建和保存一堆模型?

【问题讨论】:

标签: javascript php yii tags models


【解决方案1】:

在您的场景中,您需要利用扩展 Yii 模型的能力。

您没有发布任何代码。但是,我假设您有一个模型用作控制器的主要模型。假设标签链接到一本书。您可以扩展 book 模型以创建一个在 db 中没有表示但在表单中使用的字段。

class Book extends CActiveRecord
{
    /* Used in the form only */
    public $fldBookTags;

    public function rules()
    {
       array('title', 'required'),   // title is a db field
       array('fldBookTags', 'length', 'max'=>255),,   // Not a db field
    }
}

然后,您可以在表单中使用字段属性“fldBookTags”,就像使用普通变量一样。

现在,当这本书被保存时。您想保存标签。这只能在图书成功保存后进行。您可以通过覆盖属于 Books 模型类的 afterSave() 方法来完成此操作。

class Book extends CActiveRecord
{
    /* Used in the form only */
    public $fldBookTags;

    public function rules() { ... }
    public function afterSave() { ... }
}

afterSave() 方法将包含存储标签所需的所有函数。请注意,$this 将包含书籍属性,包括您刚刚保存的书籍的主键。

public function afterSave() { 
   // Split the tags into its individual values
   $allTags = split(" ", $this->fldBookTags);

   foreach ($allTags as $itemTag) {
      $tagModel = new Tag;
      $tagModel->tag_name = $itemTag;
      $tagModel->book_id  = $this->book_id;
   }

}

【讨论】:

  • 我知道这是个老问题,但这是正确的答案。我当时对 Yii 的理解还不够好,无法意识到这一点。我的实现有点不同,但我最终使用了将标签作为一个大字符串拉入、拆分并循环创建模型的总体思路。
猜你喜欢
  • 2017-03-28
  • 1970-01-01
  • 2017-11-05
  • 2021-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-20
  • 2019-07-03
相关资源
最近更新 更多