2012-09-21 4 views
1

와 관계 테이블에 여러 레코드를 추가.내가 설정을 심포니 3 개 테이블이 심포니

모델을 만들었을 때 symfony는 모든 것을 올바르게 구성했으며 기본적으로 스킬 테이블의 모든 스킬을 옵션으로 가지고있는 스킬의 드롭 다운 메뉴를 제공했습니다. 옵션을 선택하면 적절한 관계가 만들어집니다.

이것이 작동하고 있습니다 (일종의). 양식을 제출할 때 skill_id가 레코드에 추가되지 않습니다. 스킬 관계 테이블에 자동 증가 ID를 추가하고 flipbook_id 또는 skill_id를 추가하지 않습니다.

invalid parameter number number of bound variables does not match number of tokens 

Whaaaat 그게 무슨 뜻 : 둘 이상의 체크 박스를 클릭하면 Aaaaaand,이 좋은 메시지가? 이것은 스키마 이슈가되어야합니다.

일부 코드는 어떨까요? 예, 부탁합니다.

스키마 :

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

내가 더 코드 또는 설명을 제공해야하는지 알려주세요.

<?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; 
    } 
} 

UPDATE

나는 문제가이 같은 레코드의 여러 값을 결합하려고 믿습니다 : 여기

모델에서 생성 된 FlipbookSkillsTable.class입니다.

그래서 난 아직도 스키마가 제대로 꼼짝하지 않는
id flipbook_id skill_id 
1   2   1 
2   2   2 
3   2   3 

, 그렇지 않으면 교리가 올바른 데이터를 처리하는 방법을 알게 될 것입니다 : 그것은이 같은 선택 각 기술에 대한 새로운 기록을해야한다? 내가 명시 적으로 많은 관계에 있어야하나요?

또한 제출할 때 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); 
    } 
} 

답변

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-> getSkills; flipbook 엔티티 n-m 관계 이름 "스킬"때문에 FlipbookSkill DoctrineCollection을 반환합니다. 또는 쿼리 ('f.innerJoin Skills s ')

$ flipbookObject-> getFlipbookSkills(); 왜냐하면 flipbookSkillRelation 1-n foreignAlias ​​이름이지만, 아마 당신은 이것을 사용하지 않을 것입니다. 왜냐하면 당신은 관계에 대해별로 신경 쓰지 않기 때문에 관련 기술에 관심을 가지기 때문입니다. ... 등

잘 정의 된 schema.yml이있는 경우 양식이 올바르게 작동해야합니다.

플러스 : 왜 id 필드 (flipbook_id)에 텍스트 입력 위젯을 사용하고 있습니까? 그리고 doctrine 엔티티로 작업 할 때 sfWidgetFormSelectCheckbox를 사용하는 이유는 무엇입니까? BaseEntity 정의처럼 sfWidgetFormDoctrineChoice를 사용해야합니다.

이 정보가 도움이되기를 바랍니다.

+0

감사합니다. 업데이트되었지만 여전히 오류가 발생합니다. 또한 마지막 질문에 답하기 위해 : 플립 북 ID의 텍스트 입력은 값이로드되고 있는지를보기 위해 일시적이었습니다. 숨김으로 설정됩니다. 나는 sfWidgetFormSelectCheckbox를 사용하여 스킬을 체크 박스 HTML 요소로 가져 왔습니다. sfWidgetFormDoctrineChoice를 사용하면 드롭 다운에 넣습니다. 사용자가 여러 플럭스를 하나의 플립 북에 연결할 수 있기를 바랍니다. sfWidgetFormDoctrineChoiceMany가 제대로 작동하지 않습니다. 클래스를 가져 오는 중 오류가 발생했습니다. –

+0

Aaaaah ... multiple을 true로 설정하면 라디오 상자가 만들어집니다. –

+0

그래도 오류가 계속 발생합니다 : 잘못된 매개 변수 번호 : 바인딩 된 변수의 수가 토큰 수와 일치하지 않습니다. –

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