【问题标题】:How can I store my data into the database with the entity manager?如何使用实体管理器将数据存储到数据库中?
【发布时间】:2018-08-14 12:09:43
【问题描述】:

这是我的变量$data的输出:

array(7) { [0]=> array(2) { ["name"]=> string(14) "form[username]" ["value"]=> string(1) "1" } [1]=> array(2) { ["name"]=> string(11) "form[email]" ["value"]=> string(7) "1@12.sw" } [2]=> array(2) { ["name"]=> string(15) "form[is_active]" ["value"]=> string(1) "1" } [3]=> array(2) { ["name"]=> string(26) "form[plainPassword][first]" ["value"]=> string(0) "" } [4]=> array(2) { ["name"]=> string(27) "form[plainPassword][second]" ["value"]=> string(0) "" } [5]=> array(2) { ["name"]=> string(8) "form[id]" ["value"]=> string(1) "9" } [6]=> array(2) { ["name"]=> string(12) "form[_token]" ["value"]=> string(43) "MdSCKxGkdFs2HPUSoM2vGidSRUmPgzZC3pZaW2wK2Rk" } } 

我现在想使用实体管理器更新我的数据库中的数据:

      $entityManager->persist($data);
      $entityManager = $data->getDoctrine()->getManager();
      $entityManager->flush();
      $response = new Response();
      $response->send();

但我收到错误消息:

EntityManager#persist() 期望参数 1 是一个实体对象, 给定 NULL。

【问题讨论】:

  • $data 包含什么?
  • 它是像这样用 Ajax 创建的 var form = $(this).closest('form');var formData = form.serialize();
  • 不,不是。那是Javascript代码,其他代码sn-p是PHP代码。您如何准确地在 PHP 代码中将值分配给 $data
  • Symfony 不会神奇地将请求正文转换为实体。因此,您不能将未修改的传入请求传递给实体管理器。查看传入数据的格式,您似乎已经有了一个 Symfony 表单类型,基于该类型呈现表单。处理请求时是否有特殊原因不重用该表单类型?
  • 是的,显然您的 $data 变量不包含实体。看看 xabbuh 的评论

标签: php symfony controller doctrine entitymanager


【解决方案1】:

如果您的数据不包含一个实体,您可以创建一个新实体。从表单值中获取正确的数据并将它们放入 set 方法中。下面是一个小例子。

// Create new Entity
$entity = new EntityNameHere
$em = $this->getDoctrine()->getManager();

// Use setter function from that Entity
$entity->setName($data['name']);
$entity->setPassword($data['password']); 

$em->persist($entity);
$em->flush();

【讨论】:

  • 一个问题,我实际上想更新我现有的实体User()。这也可能吗?
  • 是的,你必须找到现有的实体,通常这是在 id 上完成的。 $entity = $this->getDoctrine()->getRepository('AppBundle:User')->findOneBy(['id' => $data['id']);
  • 这是正确的吗? $entity = new User(); $user = $this->getDoctrine()->getRepository(User::class)->find($data['id']); $em = $this->getDoctrine()->getManager(); $entity->setName($data['name']);
  • 不删除 $entity = new User();并替换为 $entity = $this->getDoctrine()->getRepository(AppBundle:User)->find($data['id']);
  • 是的,您必须以某种方式获取数据。也许试试 $data[5]['value']
【解决方案2】:
    if(is_object($data)) {
        $metadata = $em->getMetadataFactory()->getAllMetadata();
        $entities = [];
        foreach ($metadata as $entity){
            preg_match('/\w+$/',$entity->getName(), $o);
            $entities[] = $o[0];
        }
        if(in_array($data,$entities)){
            $em->persist($data);
            $em->flush();
        }
    } else {
        $query = null; //todo: $query
        $rsm = new ResultSetMapping(); //todo: fill $srm
        $em->createNativeQuery($query, $rsm)->execute();
    }

【讨论】:

  • 谢谢!我测试了您的代码并收到错误消息Notice: Undefined variable: em
  • @Jarla $em = $this->get('doctrine.orm.default_entity_manager');
  • 好的,现在我收到错误An exception occurred while executing '': SQLSTATE[42000]: Syntax error or access violation: 1065 Query was empty
猜你喜欢
  • 1970-01-01
  • 2021-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-24
  • 2012-05-23
  • 2018-01-05
  • 2013-05-09
相关资源
最近更新 更多