2013-07-29 24 views
0

我是新來的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' 
     )); 
    } 

    ... 
} 

我的問題是:

  1. 是這個處理創建與另一個實體具有一對一關係的實體的正確方法?
  2. 當我按照自己的方式完成上述工作時,似乎在提交表單時,我不再獲得書本實體。哪裏不對?

我真的很感激,如果有人能指出我正確的方向創建一個與另一個實體有一對一關係的實體。 如果代碼有問題,有人可以指出嗎?

回答

0

我所做的是:

要創建具有與另一個實體一一對應的關係實體,我使用REST方式設計像下面的網址(其中123是BOOKID)

http:sites/page/create/123 

我也改變了我的PageController createAction收到$ BOOKID代替$請求。 它看起來像下面。

class PageController extends Controller { 

    public function createAction($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()) 
     ); 
    } 
} 

讓它$ BOOKID傳進我的createAction,我已經定義了路由爲:

page_create: 
    pattern: /page/create/{bookId} 
    defaults: { _controller: MyBundle:Page:create } 
    requirements: 
     bookId: \d+ 

感謝永的意見。

0

你的代碼有同樣的問題:

(1)每個表單需要知道保存底層數據(Symfony doc)

use Symfony\Component\OptionsResolver\OptionsResolverInterface; 

public function setDefaultOptions(OptionsResolverInterface $resolver) 
{ 
    $resolver->setDefaults(array(
     'data_class' => 'Acme\TaskBundle\Entity\Task', 
    )); 
} 

(2)表單字段名稱必須相同實體類的名稱字段名

+0

嗨榮,道歉..我的PageType有這個功能,但我忘了顯示它。我編輯了代碼。 – aljx0409

+0

我想知道,通過GET請求傳遞書籍ID是正確的方式來做到這一點? – aljx0409

+1

是的!但是,忘了跟你說,你可以按照REST(Representational State Transfer)來設計你的url(例如:http:// sites/page/create/123) – Wing