如何在 Symfony 中的两个表之间创建有关系的固定装置?

Sau*_*abh 3 orm doctrine django-fixtures symfony symfony-4.2

我有两个实体,即“用户”和“地址”,其中它们之间具有“ OneToOne ”关系。

用户表有一列' address_id ',它是外键,存储地址表的id 。我尝试使用两种不同的方法创建夹具:

方法一:

地址夹具.php

namespace App\DataFixtures;

use App\Entity\Address;
use App\Entity\User;
use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Common\Persistence\ObjectManager;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;

class AddressFixture extends Fixture
{
    public function __construct(UserPasswordEncoderInterface $encoder)
    {
        $this->encoder = $encoder;
    }
    public function load(ObjectManager $manager)
    {
        $address = new Address();
        $address->setStreet('Sai Apartment');
        $address->setCity('Noida');
        $address->setState('Uttar Pradesh');
        $address->setCountry('India');
        $address->setPincode('201301');
        $manager->persist($address);
        $manager->flush();
        if (null != $address->getId()) {
            $user = new User();
            $user->setFName('Kumar');
            $user->setLName('Saurabh');
            $user->setUsername('supa-admin');
            $user->setPassword(
                $this->encoder->encodePassword($user, 'querty')
            );
            $user->setEmail('some_email@gmail.com');
            $user->setAddress($address);
            $user->setContact(78954);
            $user->setGender('male');
            $user->setAge(26);

            $user->persist($user);
            $manager->flush();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

方法二:

在此我创建了两个不同的装置:

地址夹具.php

namespace App\DataFixtures;

use App\Entity\Address;
use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Common\Persistence\ObjectManager;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;

class AddressFixture extends Fixture
{
    public function load(ObjectManager $manager)
    {
        $address = new Address();
        $address->setStreet('Sai Apartment');
        $address->setCity('Noida');
        $address->setState('Uttar Pradesh');
        $address->setCountry('India');
        $address->setPincode('201301');
        $manager->persist($address);
        $manager->flush();
    }
}
Run Code Online (Sandbox Code Playgroud)

用户夹具.php

namespace App\DataFixtures;

use App\Entity\User;
use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Common\Persistence\ObjectManager;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;

class AddressFixture extends Fixture
{
    public function __construct(UserPasswordEncoderInterface $encoder)
    {
        $this->encoder = $encoder;
    }
    public function load(ObjectManager $manager)
    {
            $user = new User();
            $user->setFName('Kumar');
            $user->setLName('Saurabh');
            $user->setUsername('supa-admin');
            $user->setPassword(
                $this->encoder->encodePassword($user, 'querty')
            );
            $user->setEmail('some_email@gmail.com');
            $user->setAddress($address);
            $user->setContact(78954);
            $user->setGender('male');
            $user->setAge(26);

            $user->persist($user);
            $manager->flush();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我跑了:

$ php bin/console 学说:fixtures:load

两种方法都没有给我所需的结果。当两个表之间使用外键时如何创建夹具?

alv*_*ery 6

您应该DependentFixtureInterface在您的UserFixture

class UserFixture extends Fixture implements DependentFixtureInterface
{

   public function getDependencies()
    {
        return [
            AddressFixture::class,
        ];
    }

}
Run Code Online (Sandbox Code Playgroud)

因此,当您尝试获取用户的参考时,SymfonyFixturesLoader将加载所有依赖项。然后将UserFixture其注入您的地址字段:

public function load(ObjectManager $manager)
{
   $user = new User();
   // ...
   $user->setAddress($this->getReference(AddressFixture::FIRST_ADDRESS));
}
Run Code Online (Sandbox Code Playgroud)

不要忘记在 AddressFixture 侧设置参考:

public function load(ObjectManager $manager)
{
   $address = new Address();
   // ...
   $this->setReference(self::FIRST_ADDRESS, $address);
}
Run Code Online (Sandbox Code Playgroud)