我是新來的Symfony 2,所以原諒我,如果這是一個簡單的問題,但我只是無法弄清楚如何處理它保存數據。Symfony的2 - 行動與一一對應的關係
我有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;
...
}
片斷這是我目前使用的PosgreSQL作爲我的RDBMS我的網頁實體
/**
* 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;
...
}
片段。
創建和保存數據到書籍表是好的。但是當涉及到爲頁面保存數據時,我需要使它通過book id來引用Book。該書已存儲在數據庫中。
我知道,老同學的方式是書ID作爲隱藏字段傳遞到頁面的表單。 我只是想知道,這是在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'
));
}
...
}
我的問題是:
- 是這個處理創建與另一個實體具有一對一關係的實體的正確方法?
- 當我按照自己的方式完成上述工作時,似乎在提交表單時,我不再獲得書本實體。哪裏不對?
我真的很感激,如果有人能指出我正確的方向創建一個與另一個實體有一對一關係的實體。 如果代碼有問題,有人可以指出嗎?
嗨榮,道歉..我的PageType有這個功能,但我忘了顯示它。我編輯了代碼。 – aljx0409
我想知道,通過GET請求傳遞書籍ID是正確的方式來做到這一點? – aljx0409
是的!但是,忘了跟你說,你可以按照REST(Representational State Transfer)來設計你的url(例如:http:// sites/page/create/123) – Wing