我在symfony中设置了3个表:
一个flipbook表,一个Skills表和一个关系表,用于将每个技能id与每个flipbook id相关联。
当我构建模型时,symfony正确构建了所有内容,默认情况下会为技能提供一个下拉菜单,其中包含技能表中的所有技能作为选项。您可以选择一个选项,它会创建适当的关系。
这是有效的(有点)。提交表单时,它不会将skill_id添加到记录中。它只是将自动增量id添加到技能关系表中,而不是flipbook_id或skill_id。 Aaaaaand,如果你点击多个复选框,你会得到这个好消息:
invalid parameter number number of bound variables does not match number of tokens
Whaaaat的意思是什么?这必须是一个架构问题呃?
一些代码怎么样? yes.please。
架构:
Flipbook:
tableName: flipbook
inheritance:
extends: SvaGeneric
type: concrete
columns:
title: { type: string(255) }
career_associations: { type: clob }
skills: { type: string(255) }
skills_associations: { type: clob }
program: { type: string(255) }
program_associations: { type: clob }
draft_id: { type: integer(10) }
FlipbookSkills:
tableName: flipbook_skills
columns:
title: { type: string(255) }
relations:
Flipbook:
foreignAlias: flipbook_skills
alias: skills
local: title
onDelete: SET NULL
FlipbookSkillRelations:
tableName: flipbook_skill_relations
actAs:
SoftDelete: ~
options:
columns:
flipbook_id: { type: integer(10), notnull: false }
skill_id: { type: integer(10), notnull: false }
relations:
Flipbook:
foreignAlias: flipbook_skills_flipbook
alias: flipbook
local: flipbook_id
onDelete: CASCADE
FlipbookSkills:
foreignAlias: flipbook_skills_skills
alias: flipbookskills
local: skill_id
onDelete: CASCADE
FlipbookSkillsRelationsForm.class.php:
$this->widgetSchema['flipbook_id'] = new sfWidgetFormInputText(array(), array('class' => 'text size-500'));
$this->widgetSchema['skill_id'] = new sfWidgetFormSelectCheckbox(array('choices' => "**WHAT GOES HERE??**"), array('class' => 'text size-500'));
$useFields = array(
'flipbook_id',
'skill_id',
);
$this->useFields($useFields);
如果我应该提供进一步的代码或解释,请告诉我。
以下是模型中生成的FlipbookSkillsTable.class:
<?php
/**
* FlipbookSkillsTable
*
* This class has been auto-generated by the Doctrine ORM Framework
*/
class FlipbookSkillsTable extends Doctrine_Table
{
/**
* Returns an instance of this class.
*
* @return object FlipbookSkillsTable
*/
public static function getInstance()
{
return Doctrine_Core::getTable('FlipbookSkills');
}
public function retrieveForFilter()
{
$res = $this->createQuery('s')
->select('s.id, s.name')
->orderBy('s.name ASC')
->execute(array(), Doctrine_Core::HYDRATE_NONE);
// if you want an empty line
$rets = array('' => '');
foreach ($res as $ret)
{
$rets[$ret[0]] = $ret[1];
}
return $rets;
}
public function getAllFlipbookSkills() {
$allSkills = Doctrine_Query::create()
->from('FlipbookSkills')
->orderBy('title ASC')
->execute();
return $allSkills;
}
}
更新
我认为问题是它试图绑定同一记录中的多个值。它应该为所选择的每项技能创建一个新记录,如下所示:
id flipbook_id skill_id
1 2 1
2 2 2
3 2 3
所以我仍然没有正确地确定架构,否则Doctrine会知道如何正确处理数据?我应该明确地建立一对多关系吗?
此外,提交时,它只将flipbook_id值添加到记录中。 skill_id记录为0
FLipbookRelationsForm:
class FlipbookSkillRelationsForm extends BaseFlipbookSkillRelationsForm
{
public function configure()
{
$this->widgetSchema['skill_id'] =
new sfWidgetFormDoctrineChoice(array('model' =>
$this->getRelatedModelName('flipbookskills'),
'expanded' => true, 'multiple' => true, 'add_empty' => false));
$useFields = array(
'flipbook_id',
'skill_id',
);
$this->useFields($useFields);
}
}
答案 0 :(得分:1)
多个问题(也许这篇文章可以提供帮助:Embedded forms in symfony 1.4 not saving propperly)
您的n-m关系看起来不太明确。您的实体应如下所示:
FlipbookSkill:
tableName: flipbook_skill
columns:
title: { type: string(255) }
relations:
Flipbooks:
class: Flipbook
refClass: FlipbookSkillRelation
local: skill_id
foreign: flipbook_id
/* Not foreignAlias and onDelete behaviour defined */
Flipbook:
tableName: flipbook
inheritance:
extends: SvaGeneric
type: concrete
columns:
title: { type: string(255) }
career_associations: { type: clob }
skills: { type: string(255) } # why this????
skills_associations: { type: clob } # why this????
program: { type: string(255) }
program_associations: { type: clob }
draft_id: { type: integer(10) }
relations:
Skills:
class: FlipbookSkill
refClass: FlipbookSkillRelation
local: flipbook_id
foreign: skill_id
FlipbookSkillRelation:
tableName: flipbook_skill_relation
actAs:
SoftDelete: ~
options:
columns:
flipbook_id: { type: integer(10), notnull: false }
skill_id: { type: integer(10), notnull: false }
relations:
Flipbook:
foreignAlias: FlipbookSkills
local: flipbook_id
foreign: id
onDelete: CASCADE
FlipbookSkill:
foreignAlias: FlipbookSkills
local: skill_id
foreign: id
onDelete: CASCADE
然后,您允许的方法/加入是:
$ flipbookObject-&GT; getSkills();因为flipbook实体n-m关系名称为“Skills”,所以返回FlipbookSkill DoctrineCollection。或者在查询中('f.innerJoin Skills s')
$ flipbookObject-&GT; getFlipbookSkills();因为flipbookSkillRelation 1-n foreignAlias的名字,但可能你永远不会使用这个(因为你并不真正关心自己的关系,而是你关心相关技能)。 ......等等。
如果你有一个定义良好的schema.yml,那么你的表单应该可以正常工作。
加: 你为什么使用和文本输入小部件的id字段(flipbook_id)???? 如果您正在使用doctrine实体,为什么还要使用sfWidgetFormSelectCheckbox?您应该像BaseEntity定义一样使用sfWidgetFormDoctrineChoice。
我希望这可以帮到你。
答案 1 :(得分:0)
您的验证员在哪里? Symfony表单无法正常使用缺少验证器或不适当的验证器。如果您的验证器接受1-1关系,并且您发送了多个值,则它将无效。
试试这个:
$this->validatorSchema->setOption('allow_extra_fields' , true);
$this->validatorSchema->setOption('filter_extra_fields' , false);
如果您的错误消失,那么验证器出现问题。否则,您可以尝试使用sfEmbedded表单,渲染sfForm,并使用选择添加FlipbooSkillForm的多个时间。如果我记得很清楚,有一些教程展示了如何在js中添加它们。