1

我在 symfony 中设置了 3 个表:

一个翻书表、一个技能表和一个关系表,用于将每个技能 ID 与每个翻书 ID 连接起来。

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

这是工作(有点)。当您提交表单时,它不会将 Skill_id 添加到记录中。它只是将自动增量 id 添加到技能关系表中,而不是 Flipbook_id 或 Skill_id。Aaaaaand,如果您单击多个复选框,您会收到以下好消息:

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

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);
  }
}
4

2 回答 2

1

多个问题(也许这篇文章可以帮助:symfony 1.4 中的嵌入式表单没有正确保存

您的 nm 关系看起来定义不明确。您的实体应如下所示:

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(); 因为翻书实体 nm 关系名称为“Skills”,所以它返回一个 FlipbookSkill DoctrineCollection。或在查询中 ('f.innerJoin Skills s')

$flipbookObject->getFlipbookSkills(); 因为flipbookSkillRelation 1-n foreignAlias name,但可能你永远不会使用这个(因为你并不真正关心关系本身,而是你关心相关技能)。... ETC

如果您有明确定义的 schema.yml,那么您的表单应该可以正常工作。

另外:为什么要为 id 字段(flipbook_id)使用文本输入小部件????如果您正在使用学说实体,为什么要使用 sfWidgetFormSelectCheckbox?您应该像 BaseEntity 定义的那样使用 sfWidgetFormDoctrineChoice。

我希望这可以帮助你。

于 2012-09-23T15:13:27.347 回答
0

你的验证者在哪里?Symfony 表单在缺少验证器或不合适的验证器时无法正常工作。如果您的验证器接受 1-1 关系,并且您发送多个值,它将不起作用。

试试这个 :

$this->validatorSchema->setOption('allow_extra_fields' , true);
$this->validatorSchema->setOption('filter_extra_fields' , false);

如果你的错误消失了,那么你的验证器有问题。否则,您可以尝试使用 sfEmbedded 表单,渲染 sfForm,并多次添加您的 FlipbooSkillForm 和选择。如果我没记错的话,有一些教程展示了如何在 js 中添加它们。

http://nacho-martin.com/dynamic-embedded-forms-in-symfony

于 2012-10-05T13:40:47.760 回答