Php 在DB中插入条令/Symfony 4中建立的关联

Php 在DB中插入条令/Symfony 4中建立的关联,php,symfony,doctrine-orm,Php,Symfony,Doctrine Orm,Symfony 4中的我的用户类: namespace App\Entity; use Doctrine\ORM\Mapping as ORM; use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; use Symfony\Component\Security\Core\User\UserInterface; /** * @ORM\Entity(repositoryClass="App\Reposit

Symfony 4中的我的用户类:

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Symfony\Component\Security\Core\User\UserInterface;

    /**
     * @ORM\Entity(repositoryClass="App\Repository\UserRepository")
     * @UniqueEntity(fields={"email"}, message="There is already an account with this email")
     */
    class User implements UserInterface
    {
        /**
         * @ORM\Id()
         * @ORM\GeneratedValue()
         * @ORM\Column(type="integer")
         */
        private $id;

    // ... rest of the User Entity
    }
我创建了另一个名为“创建者”的实体,如下所示:

两者之间的关联是当用户注册为“创建者”(不只是注册为“普通用户”)时,插入将创建者与用户关联

在数据库中插入如下内容:

$user    = new User();
$creator = new Creator();
$form    = $this->createForm(CreatorRegistrationForm::class, [$user, $creator]);
$form->handleRequest($request);

if ($form->isSubmitted() && $form->isValid()) {
    $user
        ->setEmail($form->get('email')->getData())
        ->setPassword(
                $passwordEncoder->encodePassword(
                    $user,
                    $form->get('password')->getData()
                )
            )
            ->setFirstName($form->get('firstname')->getData())
            ->setLastName($form->get('lastname')->getData())
            ->setBirthday($form->get('birthday')->getData());

            $entityManager = $this->getDoctrine()->getManager();
            $entityManager->persist($user);
            $entityManager->flush(); //This insert is successful :)

            $userID = $user->getId();

            $creator->createCreator($userID);

            $entityManager->persist($creator);
            $entityManager->flush();
            // This does nothing.
            // Can you only persist/flush once? If so, what is the right syntax?

            return $guardHandler->authenticateUserAndHandleSuccess(
                $user,
                $request,
                $authenticator,
                'main' // firewall name in security.yaml
            );
        }
这是通过条令在DB中创建关联的正确方法吗?仍在努力理解协会是如何运作的。您是否必须明确说明与上述内容类似的关联?这将返回一个错误
警告:从空值创建默认对象
,并指出:

public function createCreator($userid)
{        
    $this->user->id = $userid; //this here is what the error points to.

    return $this;    
}

做这件事的正确方法是什么?

原则要求
Creator->user
成为
user
类的对象

因此,您可能需要一个
Creator::setUser(User)
方法,并执行如下操作:

//...
$entityManager->persist($user);
$creator->setUser($user);
$entityManager->persist($creator);

$entityManaer->flush();

不,这不是与教义产生有意义关系的正确方式。冒着不友善的风险,你甚至都不亲近。我所能做的就是建议你一步一步地完成这部片子。但是你可能想从如何使用实体表单开始,因为你问题中的许多代码要么是错误的,要么是不必要的。我的意思是,你仍然可以很友善,但也很有帮助。我看了这份文件,但忘了。我会再看一遍。我会从你的问题中删除大部分与表单处理相关的代码。您的问题要么是关于表单处理和表单组件,要么是关于ORM。看起来是关于后者的,所以我的答案是。如何通过条令使数据持久化并不真正相关,清理这些数据将导致更高质量的问题。
//...
$entityManager->persist($user);
$creator->setUser($user);
$entityManager->persist($creator);

$entityManaer->flush();