1

symfony で 3 つのテーブルをセットアップしました。

各スキル ID を各フリップブック ID に接続するフリップブック テーブル、スキル テーブル、およびリレーション テーブル。

私がモデルを構築したとき、symfony はすべてを正しく構築し、デフォルトで、スキル テーブルのすべてのスキルをオプションとして持つスキルのドロップダウン メニューを提供しました。オプションを選択すると、適切な関係が作成されます。

これは機能しています(一種)。フォームを送信しても、skill_id はレコードに追加されません。自動インクリメント ID をスキル リレーション テーブルに追加するだけで、flipbook_id または skill_id は追加しません。そして、複数のチェックボックスをクリックすると、次の素敵なメッセージが表示されます。

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

SO私はまだスキーマを正しく釘付けにしていません. そうしないと、Doctrineはデータを正しく処理する方法を知っているでしょうか? 1 対多の関係を明示的に設定する必要がありますか?

また、送信時には、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

複数の問題(おそらくこの投稿が役立つかもしれません:symfony1.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」であるため、wichはFlipbookSkillDoctrineCollectionを返します。またはクエリで('f.innerJoin Skills')

$ flipbookObject-> getFlipbookSkills(); なぜなら、flipbookSkillRelation 1-nのforeignAlias名ですが、おそらくこれを使用することはないでしょう(関係自体はあまり気にしないので、代わりに関連するスキルを気にします)。...など

明確に定義された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 に答える