Doctrine orm 从Zend Framework 2表单发布的id加载子对象的最佳方式是什么

Doctrine orm 从Zend Framework 2表单发布的id加载子对象的最佳方式是什么,doctrine-orm,zend-framework2,Doctrine Orm,Zend Framework2,我有两个类,Widget和Person。小部件类引用Person的实例作为其所有者。它们通过doctrine2从数据库中存储/检索 我已经创建了一个Zend Framework 2表单来输入小部件的详细信息,其中包括一个select,您可以在其中选择小部件的所有者,这个表单元素将返回要在所有者处设置的Person对象的id 在当前状态下,Widget类的setOwner方法将获取Person类型的对象或id,然后可以使用Doctrine2实体管理器从数据库中加载该对象 虽然这是可行的,但我认为这

我有两个类,Widget和Person。小部件类引用Person的实例作为其所有者。它们通过doctrine2从数据库中存储/检索

我已经创建了一个Zend Framework 2表单来输入小部件的详细信息,其中包括一个select,您可以在其中选择小部件的所有者,这个表单元素将返回要在所有者处设置的Person对象的id

在当前状态下,Widget类的setOwner方法将获取Person类型的对象或id,然后可以使用Doctrine2实体管理器从数据库中加载该对象

虽然这是可行的,但我认为这不是最好的方法,因为小部件对象正在处理来自数据库的加载,它需要访问实体管理器才能做到这一点

据我目前所知,我能做到这一点的只有两种方法,一种是我让它工作的方式,另一种是创建一个新的水合器,在水合对象之前将对象从数据库中取出,或者有其他方法吗

我希望架构尽可能整洁,因此我想知道人们认为在ZF2中实现这一点的最佳方式是什么

这是我目前的设置:

class Widget {
    protected $id;
    protected $name;
    protected $owner;

    // Doctrine Entity Manager
    protected $entityManager;

   public function __construct($entityManager)
   {
       $this->entityManager = $entityManager;
   }

    // methods, getters & setters

    public function setOwner($owner)
    {
        if (is_object($owner) && $owner instanceof Person)
        {
            $this->owner = $owner;
        }
        else if (is_scalar($owner)
        {
            $this->owner = $this->entityManager->find('Person', $owner);
        }
    }
}

class Person {
    protected $id;
    protected $name;

    // other member variables & methods
}

将EM放在域类中肯定是个坏主意。如何构建选择选项?如果您是从一组人员构建它们,那么您应该已经在表单中的某个位置拥有了该人员数组?如果是这样,你就不能从中选择一个吗。你可以发布你的表单代码,以及处理发布值的代码吗?表单是从注释生成的,然后我使用以下代码填写select-in控制器:$query=$this->getEntityManager->createQuerySELECT p.id,p.name from Person p;所以我可以在这里加载Person对象,但我仍然可以设置从一个物体到另一个物体的自动补水。目前,它看起来像是一个定制的水合器,或者可能是答案。$persons=$query->getResult;$options=数组;foreach$persons作为$p$options[$p[id]]=$p[name];$form->get'owner'->setAttributeoptions,$options;