私は Symfony 2 を初めて使用します。これが単純な問題である場合は申し訳ありませんが、対処方法がわかりません。
Book と Page という 2 つのエンティティがあります。
これは Book エンティティ コードのスニペットです
/**
* Book
*
* @ORM\Table(name="`book`")
*/
class Book {
/**
* @var integer
*
* @ORM\Column(name="`id`", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="`name`", type="string", length=255, nullable=false)
*/
private $name;
...
}
そして、これは私の Page エンティティのスニペットです
/**
* Page
*
* @ORM\Table(name="`page`")
*/
class Page {
/**
* @var integer
*
* @ORM\Column(name="`id`", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\OneToOne(targetEntity="Book")
* @ORM\JoinColumn(name="`book_id`", referencedColumnName="`id`")
*/
private $book;
/**
* @var string
*
* @ORM\Column(name="`page_number`", type="bigint", nullable=false)
*/
private $pageNumber;
...
}
現在、RDBMS として PosgreSQL を使用しています。
Book テーブルにデータを作成して保存することは問題ありません。しかし、ページのデータを保存する場合は、ブック ID でブックを参照する必要があります。ブックは既にデータベースに保存されています。
古い学校の方法は、本のIDを隠しフィールドとしてPageフォームに渡すことです。これは Symfony で行う正しい方法ですか?
私が試したことは、ページ作成アクションに GET リクエストを渡すことです。の線に沿った何か
http://sites/page/create?bookId=123
そして、ページ コントローラーでの適切なアクションは次のとおりです。
class PageController extends Controller {
public function createAction(Request $request) {
// Check if bookId has been passed
$bookId = $request->get('bookId');
// Find the book by its $bookId
$book = $this->getDoctrine()->getRepository("MyBundle:Book")->find($bookId);
// Create new page
$page = new Page();
// Assign the book to the page
$page->setBook($book);
// Create the page form
$pageForm = $this->createForm(
new PageType(),
$page
);
$pageForm->handleRequest($request);
if ($pageForm->isValid()) {
$pageData = $pageForm->getData();
// SAVE DATA HERE
// Redirect to index page
return new RedirectResponse($this->generateUrl('index_page'));
}
// Then render to the template
return $this->render(
'MyBundle:Page:index.html.twig',
array('form' => $pageForm->createView())
);
}
}
そして、私のページの種類は次のとおりです。
class PageType extends AbstractType {
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder->add('page_number', 'text', array(
'label' => 'Page Number',
'required' => true,
)
);
$builder->add('content', 'textarea', array(
'label' => 'Page Content',
'required' => false,
)
);
$builder->add('save', 'submit', array(
'label' => 'Save',
'attr' => array('class' => 'btn')
));
}
public function setDefaultOptions(OptionsResolverInterface $resolver) {
$resolver->setDefaults(array(
'data_class' => 'MyBundle\Entity\Page'
));
}
...
}
私の問題は次のとおりです。
- これは、別のエンティティと 1 対 1 の関係を持つエンティティの作成に対処する正しい方法ですか?
- 上記の方法を実行すると、フォームを送信すると、本のエンティティが取得できなくなったようです。なにが問題ですか?
別のエンティティと 1 対 1 の関係を持つエンティティの作成に関して、誰かが私を正しい方向に向けることができれば、本当に感謝しています。コードに何か問題がある場合は、誰かが指摘してくれませんか?