如何使用一个 yii 表单向数据库添加多个条目?
How do I add multiple entries to a database with one yii form?
我正在尝试在 yii 中为需要与所述项目关联的标签的项目构建创建表单。为了这个问题,我设置了三个表来处理这个问题。已创建表:项目、标签(均具有唯一 ID 和名称)和 item_tag_relation(包含 2 个 ID),以及必要的模型、控制器和视图。
到目前为止,所有这些都在正常工作。如果需要,我可以转到 item/create、tag/create 和 itemTagRelation/create 并单独创建每个片段。但是,我希望所有三个都属于一个页面。在此页面上,我希望能够将可变数量的标签输入到由空格分隔的文本字段中,并让表单在保存项目的同时保存标签及其关系。很像 Whosebug 问题创建页面,现在我看看它。为此,我已经让这个 javascript 框 MagicSuggest 处于半工作状态。
问题是我无法从数据库中加载或保存标签。我知道我可以使用 ItemController 将多个模型传递给视图,但我该如何加载和保存可变数量?是否有某种 yii 标准方法可以同时构建和保存一堆模型?
根据您的情况,您需要利用扩展 Yii 模型的能力。
您没有post任何代码。但是,我假设您有一个模型用作控制器的主要模型。假设标签链接到一本书。您可以扩展书籍模型以创建一个在数据库中没有表示但在表单中使用的字段。
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 模型 class.
的 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 中为需要与所述项目关联的标签的项目构建创建表单。为了这个问题,我设置了三个表来处理这个问题。已创建表:项目、标签(均具有唯一 ID 和名称)和 item_tag_relation(包含 2 个 ID),以及必要的模型、控制器和视图。
到目前为止,所有这些都在正常工作。如果需要,我可以转到 item/create、tag/create 和 itemTagRelation/create 并单独创建每个片段。但是,我希望所有三个都属于一个页面。在此页面上,我希望能够将可变数量的标签输入到由空格分隔的文本字段中,并让表单在保存项目的同时保存标签及其关系。很像 Whosebug 问题创建页面,现在我看看它。为此,我已经让这个 javascript 框 MagicSuggest 处于半工作状态。
问题是我无法从数据库中加载或保存标签。我知道我可以使用 ItemController 将多个模型传递给视图,但我该如何加载和保存可变数量?是否有某种 yii 标准方法可以同时构建和保存一堆模型?
根据您的情况,您需要利用扩展 Yii 模型的能力。
您没有post任何代码。但是,我假设您有一个模型用作控制器的主要模型。假设标签链接到一本书。您可以扩展书籍模型以创建一个在数据库中没有表示但在表单中使用的字段。
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 模型 class.
的 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;
}
}