2012-09-21 34 views
1

我已經安裝symfony的3個表:添加多個記錄的關係表用symfony

翻書表中,A技能表和關係表,給每個技能ID,每個ID翻書連接。

當我構建模型時,symfony構造了一切正確,默認情況下爲技能提供了一個下拉菜單,該技能擁有技能表中的所有技能作爲選項。您可以選擇一個選項並創建適當的關係。

這是工作(有點)。提交表單時,它不會將skill_id添加到記錄中。它只是將自動增量ID添加到技能關係表中,而不是flipbook_id或skill_id。 Aaaaaand,如果你點擊一個以上的複選框,你會得到這個漂亮的消息:

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

Whaaaat意味着什麼?這已經是一個架構問題了嗎?

一些代碼如何?是的,請。

模式:

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

UPDATE

我相信問題是它試圖在同一記錄多值綁定。它應該選擇每個技能的新紀錄,就像這樣:

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();因爲活頁夾實體n-m關係名稱爲「技能」,所以將返回一個FlipbookSkill DoctrineCollection。或者在查詢('f。innerJoin技能S')

$ flipbookObject-> getFlipbookSkills();由於flipbookSkillRelation 1-n foreignAlias的名字,但可能你永遠不會使用這個(因爲你並不真正關心自己的關係,而是關心相關技能)。 ...等

如果你有一個明確的schema.yml,那麼你的表格應正常工作。

加: 爲什麼您使用和文本輸入小部件的id字段(flipbook_id)???? 如果你正在使用教義實體,你爲什麼使用sfWidgetFormSelectCheckbox?你應該像BaseEntity定義一樣使用sfWidgetFormDoctrineChoice。

我希望這可以幫助你。

+0

感謝您對架構的幫助。它已更新,但我仍然收到錯誤。還要回答一些最後的問題:對於活頁簿標識的文本輸入是暫時的,以查看該值是否正在被加載。它被設置爲隱藏。我正在使用sfWidgetFormSelectCheckbox將技巧加入複選框html元素。如果我使用sfWidgetFormDoctrineChoice,它會將它們放入下拉列表中。我希望用戶能夠將多種技能與一個翻書相關聯。我無法讓sfWidgetFormDoctrineChoiceMany正常工作。獲取類未找到錯誤。 –

+0

Aaaaah ...設置爲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