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