symfony2实体对象与整数崩溃

时间:2014-08-27 09:10:18

标签: symfony object doctrine entity

我定义了一个像:

这样的实体
/**
 * @ORM\ManyToOne(targetEntity="Pr\UserBundle\Entity\Client")
 * @ORM\JoinColumn(name="client_id", referencedColumnName="id")

 */
private $client_id;

.....

public function setClientId($clientId = null)
{
    $this->client_id = $clientId;

    return $this;
}

我可以使用两个控制器创建新的数据库条目。第一个是" admin-only"管理员可以创建具有其选择的客户端ID的数据库条目:

->add('client_id', 'entity', array(
                                   'data_class' => null,
                                   'attr' => array(
                                                   'class' => 'selectstyle'),
                                   'class' => 'PrUserBundle:Client',
                                   'property' => 'name',
                                   'required' => true,
                                   'label'  => 'staff.location',
                                   'empty_value' => 'admin.customer_name',
                                   'empty_data'  => null
                                   )
     )

   ......
    // Handling the form
        $em = $this->getDoctrine()->getManager();
        $saniType->setName($form->get('name')->getData());
        $saniType->setClientId($form->get('client_id')->getData());
        $saniType->setCreated(new \DateTime(date('Y-m-d H:m:s')));
        $saniType->setCreatedBy($user->getUsername());
        $em->persist($saniType);
        $em->flush();

第二个是针对客户端本身,他无法设置不同的客户端ID。因此,我刚刚删除了表单字段" client_id"并将其替换为users-> getClientId():

$saniType->setSpecialClientId($form->get('client_id')->getData());

当我以管理员身份添加条目时,它可以正常工作。如果我尝试添加一个作为"客户端",它会崩溃,并显示以下错误消息

 Warning: spl_object_hash() expects parameter 1 to be object, integer given in /var/www/symfony/webprojekt/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php line 1389 

我是symfony的新手,所以我没有力量弄清楚会发生什么。我只知道在第一种情况下,管理员将提交一个对象(实体)。在第二个(客户端)的情况下,我通过

设置一个整数
$user = $this->container->get('security.context')->getToken()->getUser();

是否有解决方案,以便我可以处理实体对象和给定的整数,就像客户端添加条目时那样?

3 个答案:

答案 0 :(得分:2)

您不必知道客户端ID。你必须自己设置客户端。

/**
 * @ORM\ManyToOne(targetEntity="Pr\UserBundle\Entity\Client")
 * @ORM\JoinColumn(name="client_id", referencedColumnName="id")
 */
private $client;

.....

public function setClient(\Pr\UserBundle\Entity\Client $client = null)
{
    $this->client = $client;

    return $this;
}

答案 1 :(得分:2)

您应该将关系定义更改为:

/**
 * @ORM\ManyToOne(targetEntity="Pr\UserBundle\Entity\Client")
 * @ORM\JoinColumn(name="client_id", referencedColumnName="id")

 */
private $client;

.....

public function setClient($client = null)
{
    $this->client = $client;

   return $this;
}

然后是表格:

->add('client', 'entity', array(
        'data_class' => null,
        'attr' => array('class' => 'selectstyle'),
        'class' => 'PrUserBundle:Client',
        'property' => 'name',
        'required' => true,
        'label'  => 'staff.location',
        'empty_value' => 'admin.customer_name',
        'empty_data'  => null
    )
)

处理表格:

form = $this->createForm(new SaniType(), $entity);

$form->handleRequest($request);

if ($form->isValid()) {
    // perform some action...

    return $this->redirect($this->generateUrl('some_success'));
}

有关处理表单的更多信息:http://symfony.com/doc/current/book/forms.html#handling-form-submissions


也一无所获:

用于自动更新属性,例如createdBy / updatedBy我建议您使用Doctrine Extension:https://github.com/Atlantic18/DoctrineExtensions/blob/master/doc/blameable.md

答案 2 :(得分:0)

我找到了一个解决方案:

Symfony2: spl_object_hash() expects parameter 1 to be object, string given in Doctrine

这是一种解决方法,但暂时还不错。

相关问题