1

Zend Framework 2 と Doctrine (どちらも最新の安定バージョン) を使用するアプリケーションを作成しています。Zend Form と組み合わせてドクトリン エンティティをデータベースに保存する方法については、多くのドキュメント (主にチュートリアルとブログ投稿) があります。残念ながら、それらは一対多または多対多の関係を持たない単純なエンティティのみを扱います。

これは、私が自分のコードに採用した例の 1 つです。

http://www.jasongrimes.org/2012/01/using-doctrine-2-in-zend-framework-2/

この例のアルバム エンティティでは、アーティストは (すでに長い) チュートリアルをできるだけ単純にするための文字列であることを理解しています。しかし、実際の状況では、これはもちろん、アーティスト エンティティとの 1 対多の関係 (または多対多の関係) になります。ビューでは、アーティストを選択できる場所に選択ボックスを表示し、データベースで見つかったすべてのアーティスト エンティティを一覧表示して、適切なアーティストを選択できるようにします。

アルバムの例に従って、コントローラーで「編集」アクションを設定した方法は次のとおりです。

public function editAction()
{
// determine the id of the album we're editing
    $id = $this->params()->fromRoute("id", false);
    $request = $this->getRequest();

// load and set up form
    $form = new AlbumForm();
    $form->prepareElements();
    $form->get("submit")->setAttribute("label", "Edit");

// retrieve album from the service layer
    $album = $this->getSl()->get("Application\Service\AlbumService")->findOneByAlbumId($id);

    $form->setBindOnValidate(false);
    $form->bind($album);

    if ($request->isPost()) {
        $form->setData($request->getPost());
        if ($form->isValid()) { 
            // bind formvalues to entity and save it
            $form->bindValues();
            $this->getEm()->flush(); 
            // redirect to album
            return $this->redirect()->toRoute("index/album/view", array("id"=>$id));
        }
    }
    $data = array(
        "album" => $album,
        "form" => $form
        );
    return new ViewModel($data);
}

アーティストが文字列ではなくアーティスト エンティティである場合、この例をどのように変更する必要がありますか?

また、アルバムに複数のトラック エンティティもある場合、それらはどのように処理されるでしょうか?

4

1 に答える 1

0

例をまったく変更する必要はありません。エンティティとフォームで変更が行われます。

これは良いリファレンスです: Doctrine Orm Mapping

したがって、多くの余分な作業を節約するために、OnToMany 関係は次のように使用されます: cascade = persist:

 /**
 * @ORM\OneToMany(targetEntity="Artist" , mappedBy="album" , cascade={"persist"})
 */
private $artist;

フォーム オブジェクトを永続化する場合、エンティティは関連付けられたエンティティも保存する必要があることを認識しています。これを含めなかった場合は、コレクションを使用して手動で行う必要があります。

フォームをより簡単にするために、次のように Doctrines Object Select を使用できます。

    $this->add(
    [
        'type' => 'DoctrineModule\Form\Element\ObjectSelect',
        'name' => 'artist',
        'options' => [
            'object_manager' => $this->objectManager,
            'target_class'   => 'Artist\Entity\Artist',
            'property'       => 'name',  //the name field in Artist, can be any field
            'label' => 'Artist',
            'instructions' => 'Artists connected to this album'

        ],
        'attributes' => [
            'class'     => '',  //Add any classes you want in your form here
            'multiple' => true,  //You can select more than one artist
            'required' => 'required',
        ]
    ]
    );

したがって、フォームがコレクションを処理します。エンティティが永続化を処理するため、例のコントローラーを変更する必要はありません...

これで軌道に乗れることを願っています。

于 2014-12-20T20:40:48.473 に答える