Database 如何使用zend表单和条令将一对多关系保存到数据库

Database 如何使用zend表单和条令将一对多关系保存到数据库,database,doctrine-orm,entity,zend-framework2,zend-form,Database,Doctrine Orm,Entity,Zend Framework2,Zend Form,我正在编写一个使用Zend Framework 2和Doctrine(两者都是最新的稳定版本)的应用程序。 有很多文档(主要是教程和博客文章)处理将条令实体与Zend表单结合保存到数据库的问题。不幸的是,它们只处理没有一对多或多对多关系的简单实体 这是我在自己的代码中采用的示例之一 我知道在本例的唱片集实体中,艺术家是一个字符串,以使(已经很长的)教程尽可能简单。但在现实世界中,这当然是与艺术家实体(甚至是多对多)的一对多关系。在视图中,可以显示一个选择框,其中可以选择艺术家,列出数据库中可以

我正在编写一个使用Zend Framework 2和Doctrine(两者都是最新的稳定版本)的应用程序。 有很多文档(主要是教程和博客文章)处理将条令实体与Zend表单结合保存到数据库的问题。不幸的是,它们只处理没有一对多或多对多关系的简单实体

这是我在自己的代码中采用的示例之一

我知道在本例的唱片集实体中,艺术家是一个字符串,以使(已经很长的)教程尽可能简单。但在现实世界中,这当然是与艺术家实体(甚至是多对多)的一对多关系。在视图中,可以显示一个选择框,其中可以选择艺术家,列出数据库中可以找到的所有艺术家实体,以便选择正确的艺术家

下面是相册的示例,这是我如何在控制器中设置“编辑”操作的:

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);
}
如果艺术家不是一个字符串,而是一个艺术家实体,那么这个示例需要如何修改


假设相册也有多个曲目实体,这些实体将如何处理?

示例根本不需要更改,更改将发生在实体和表单上

这是一个很好的参考:

因此,为了节省大量额外工作,您的OnToMany关系将使用:cascade=persist:

 /**
 * @ORM\OneToMany(targetEntity="Artist" , mappedBy="album" , cascade={"persist"})
 */
private $artist;
在持久化表单对象时,实体知道它还必须保存关联的实体。如果未包含此项,则必须使用集合手动执行

为了使表单更易于使用like,可以使用Doctrines对象选择,如下所示:

    $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',
        ]
    ]
    );
因此,现在您的表单为您处理集合,根据您的示例,控制器不需要更改,因为实体将处理持久化的

希望这能让你走上正轨