我是 Symfony 2 的新手。如果这是一个简单的问题,请原谅我,但我就是不知道如何处理它。
我有 2 个实体,称为 Book 和 Page。
这是书实体代码的片段
/**
* 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
*
* @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;
...
}
我目前使用 PosgreSQL 作为我的 RDBMS。
创建数据并将其保存到 Book 表中很好。但是在为页面保存数据时,我需要通过书籍 ID 使其引用一本书。这本书已经存储在数据库中。
我知道老派的方法是将书籍 ID 作为隐藏字段传递到页面表单中。我只是想知道,这是在 Symfony 中做的正确方法吗?
我尝试过的是我将 GET 请求传递给页面创建操作。类似的东西
http://sites/page/create?bookId=123
Page 控制器上的适当操作是:
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'
));
}
...
}
我的问题是:
- 这是处理创建与另一个实体具有一对一关系的实体的正确方法吗?
- 当我按照上面的方式进行操作时,似乎当我提交表单时,我不再获得图书实体。怎么了?
如果有人能指出我在创建与另一个实体具有一对一关系的实体方面的正确方向,我将不胜感激。如果代码有任何问题,有人可以指出吗?