Symfony1 使用symfony向关系表添加多条记录

Symfony1 使用symfony向关系表添加多条记录,symfony1,doctrine,symfony-1.4,symfony-forms,Symfony1,Doctrine,Symfony 1.4,Symfony Forms,我在symfony中设置了3个表: “动画书”表、技能表和关系表,用于将每个技能id与每个“动画书”id连接起来 当我构建模型时,symfony正确地构建了所有内容,并且默认情况下为技能提供了一个下拉菜单,其中包含技能表中的所有技能作为选项。您可以选择一个选项,它将创建适当的关系 这有点起作用了。提交表单时,不会将技能id添加到记录中。它只是将自动递增id添加到“技能关系”表中,而不是“动画书”id或“技能”id.aaaa。如果您单击多个复选框,您会收到以下好消息: invalid parame

我在symfony中设置了3个表:

“动画书”表、技能表和关系表,用于将每个技能id与每个“动画书”id连接起来

当我构建模型时,symfony正确地构建了所有内容,并且默认情况下为技能提供了一个下拉菜单,其中包含技能表中的所有技能作为选项。您可以选择一个选项,它将创建适当的关系

这有点起作用了。提交表单时,不会将技能id添加到记录中。它只是将自动递增id添加到“技能关系”表中,而不是“动画书”id或“技能”id.aaaa。如果您单击多个复选框,您会收到以下好消息:

invalid parameter number number of bound variables does not match number of tokens
那是什么意思?这一定是个模式问题吧

代码怎么样?好的,谢谢

模式:

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
$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);
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);
  }
}
FlipbookSkillsRelationsForm.class.php:

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
$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);
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);
  }
}
让我知道我是否应该提供进一步的代码或解释

以下是在模型中生成的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值添加到记录中。技能id记录为0

动画书关系表单:

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
$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);
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);
  }
}
多个问题(也许这篇文章可以帮助:)

你的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->getSkills();因为“动画书”实体n-m关系名为“Skills”,所以它返回一个“动画书kill DoctrineCollection”。或在查询中('f.s')

$flipbookObject->getFlipbookSkills();因为flipbookSkillRelation 1-n foreignAlias名称,但您可能永远不会使用此名称(因为您自己并不真正关心关系,而是关心相关技能)。 ... 等

如果您有一个定义良好的schema.yml,那么您的表单应该可以正常工作

加上: 为什么要对id字段(动画书id)使用和文本输入小部件???? 如果您使用的是条令实体,为什么要使用sfWidgetFormSelectCheckbox?您应该像BaseEntity定义的那样使用SFWidgetFormDoctoryEchoice

我希望这能对你有所帮助。

多个问题(也许这篇文章能帮上忙:)

你的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->getSkills();因为“动画书”实体n-m关系名为“Skills”,所以它返回一个“动画书kill DoctrineCollection”。或在查询中('f.s')

$flipbookObject->getFlipbookSkills();因为flipbookSkillRelation 1-n foreignAlias名称,但您可能永远不会使用此名称(因为您自己并不真正关心关系,而是关心相关技能)。 ... 等

如果您有一个定义良好的schema.yml,那么您的表单应该可以正常工作

加上: 为什么要对id字段(动画书id)使用和文本输入小部件???? 如果您使用的是条令实体,为什么要使用sfWidgetFormSelectCheckbox?您应该像BaseEntity定义的那样使用SFWidgetFormDoctoryEchoice


我希望这能对您有所帮助。

您的验证器在哪里?Symfony表单在缺少验证器或验证器不正确的情况下无法正常工作。如果您的验证器接受1-1关系,并且您发送了多个值,那么它将不起作用

试试这个:

$this->validatorSchema->setOption('allow_extra_fields' , true);
$this->validatorSchema->setOption('filter_extra_fields' , false);
如果您的错误消失,那么您的验证器有问题。否则,您可以尝试使用sfEmbedded forms,渲染sfForm,并通过选择多次添加FlipbooSkillForm。如果我记得很清楚的话,有一些教程展示了如何在js中添加它们


您的验证器在哪里?Symfony表单在缺少验证器或验证器不正确的情况下无法正常工作。如果您的验证器接受1-1关系,并且您发送了多个值,那么它将不起作用

试试这个:

$this->validatorSchema->setOption('allow_extra_fields' , true);
$this->validatorSchema->setOption('filter_extra_fields' , false);
如果您的错误消失,那么您的验证器有问题。否则,您可以尝试使用sfEmbedded forms,渲染sfForm,并通过选择多次添加FlipbooSkillForm。如果我记得很清楚的话,有一些教程展示了如何在js中添加它们


感谢您对架构的帮助。它已被更新,但我仍然得到错误。还要回答最后几个问题:“动画书id”的文本输入是临时的,以查看是否加载了值。它被设置为隐藏。我正在使用sfWidgetFormSelectCheckbox将技能放入checkbox html元素中。如果我使用sfWidgetFormDoctrineChoice,它会将它们放入下拉列表中。我希望用户能够将多种技能关联到一本动画书。我也无法让sfWidgetFormDoctrineChoiceMany正常工作。获取未找到的类错误。Aaaaah…将multiple设置为true,它将生成单选框。但仍然获取错误:无效参数编号:绑定变量的数量与令牌的数量不匹配我猜FlipbookSkillRelationsForm(作为任何关系实体形式)永远不应使用。我在问关于FlipbookForm的问题。在动作代码中,应该有类似$this->form=new XXXX()的内容。我需要XXXX类的代码(我猜它是FlipbookForm),感谢您对模式的帮助。它已被更新,但我仍然得到错误。还要回答最后几个问题:“动画书id”的文本输入是临时的,以查看是否加载了值。它被设置为隐藏。我正在使用sfWidgetFormSelectCheckbox将技能放入checkbox html元素中。如果我使用sfWidgetFormDoctrineChoice,它会将它们放入下拉列表中。我希望用户能够将多种技能关联到一本动画书。我也无法让sfWidgetFormDoctrineChoiceMany正常工作。获取未找到的类错误。Aaaaah…将multiple设置为true,它将使t