マルチリレーション (複数の依存する 1 対多のリレーション) フォームを機能させようとしていますが、うまくいきません。FOSUserbundle で Symfony 2.3 を使用しています。
エンティティ ユーザー
use FOS\UserBundle\Entity\User as BaseUser;
[...]
/**
* @ORM\Entity
* @Gedmo\Loggable
* @ORM\Table(name="ta_user", indexes={@ORM\Index(name="IDX_LOGIN_TOKEN", columns={"login_token"})})
*/
class User extends BaseUser
{
[...]
/**
* @ORM\OneToMany(targetEntity="UserLifestyle", mappedBy="user", fetch="LAZY", cascade={"persist", "remove"})
*/
protected $lifestyle;
ユーザーマネージャー
use Doctrine\ORM\EntityManager;
use FOS\UserBundle\Entity\UserManager as BaseUserManager;
use Acme\UserBundle\Entity\LifestyleQuestion;
use Acme\UserBundle\Entity\UserLifestyle;
[...]
class UserManager extends BaseUserManager {
public function createUser() {
$user = parent::createUser();
$lifestyle = new UserLifestyle();
$lifestyle->setQuestion($this->objectManager->getReference('Acme\UserBundle\Entity\LifestyleQuestion', 1));
$user->addLifeStyle($lifestyle);
$lifestyle = new UserLifestyle();
$lifestyle->setQuestion($this->objectManager->getReference('Acme\UserBundle\Entity\LifestyleQuestion', 2));
$user->addLifeStyle($lifestyle);
$lifestyle = new UserLifestyle();
$lifestyle->setQuestion($this->objectManager->getReference('Acme\UserBundle\Entity\LifestyleQuestion', 3));
$user->addLifeStyle($lifestyle);
return $user;
}
エンティティ ユーザーライフ スタイル
/**
* @ORM\Entity
* @Gedmo\Loggable
* @ORM\Table(name="ta_user_lifestyle")
*/
class UserLifestyle
{
/**
* @ORM\Id
* @ORM\Column(type="smallint")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\ManyToOne(targetEntity="User", inversedBy="lifestyle")
* @ORM\JoinColumn(name="user_id")
*/
protected $user;
/**
* @ORM\ManyToOne(targetEntity="LifestyleQuestion", inversedBy="answeredByUser")
* @ORM\JoinColumn(name="question_id")
*/
protected $question;
/**
* @ORM\ManyToOne(targetEntity="LifestyleAnswer", inversedBy="userAnswers")
* @ORM\JoinColumn(name="answer_id")
* @Gedmo\Versioned
*/
protected $answer;
次に、フォームタイプがあります
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Doctrine\ORM\EntityRepository;
class RegistrationType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('email', NULL, array('label' => 'E-Mail'))
[...]
->add('lifestyle', 'collection', array(
'type' => new RegistrationLifestyleType(),
'allow_add' => false,
'allow_delete' => false,
'label' => false,
))
そして今、関連があるはずRegistrationLifestyleType
です。しかし、私はそれがどのように見えるべきか分かりません。私の登録フォームには 3 つの選択肢フィールドがあり、これらの質問に関連する質問 (ラベル) と一連の回答 (選択肢フィールド) が表示されると思います。UserManager は、新しく作成されたユーザーに 3 つの質問を割り当てるため、次の方法で質問を取得できます。
$lifestyles = $user->getLifestyles();
foreach ($lifestyles as $lifestyle) {
$question = $lifestyle->getQuestion(); // echo $question->getQuestion();
$answers = $lifestyle->getQuestion()->getAnswers(); // loop through $answers and echo $answer->getAnswer();
}
しかし、これを機能させるために、フォームの種類を変更する方法を教えてください。重要: 私の意図は、組み込み機能を可能な限り使用し、サービス コンテナーとエンティティ マネージャーを注入することによってフォーム タイプなどの膨張を回避しようとすることです。