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
两种方法都没有给我所需的结果。当两个表之间使用外键时如何创建夹具?
您应该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)
| 归档时间: |
|
| 查看次数: |
3862 次 |
| 最近记录: |