symfony - 如何在 Symfony 中的两个表之间创建有关系的夹具?
问题描述
我有两个实体说“用户”和“地址”,它们之间有“ OneToOne ”关系。
用户表有一个列' address_id ',它是外键,存储地址表的id 。我尝试使用 2 种不同的方法创建夹具:
方法一:
地址夹具.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();
}
}
}
方法二:
在此我创建了两个不同的夹具:
地址夹具.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();
}
}
用户夹具.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();
}
}
然后我跑了:
$ php bin/控制台原则:fixtures:load
两种方式都没有给我所需的结果。两个表之间使用外键时如何创建夹具?
解决方案
你应该DependentFixtureInterface
在你的UserFixture
:
class UserFixture extends Fixture implements DependentFixtureInterface
{
public function getDependencies()
{
return [
AddressFixture::class,
];
}
}
因此,当您尝试为您的用户获取参考时,SymfonyFixturesLoader
将加载所有依赖项。然后在您UserFixture
将其注入您的地址字段中:
public function load(ObjectManager $manager)
{
$user = new User();
// ...
$user->setAddress($this->getReference(AddressFixture::FIRST_ADDRESS));
}
不要忘记在 AddressFixture 端设置参考:
public function load(ObjectManager $manager)
{
$address = new Address();
// ...
$this->setReference(self::FIRST_ADDRESS, $address);
}
推荐阅读
- spring - 使用 Spring RestTemplate 在多部分中发布字节数组
- c - 一个简单的 IPv6 TCP 客户端有一些问题
- maven - 在 kotlin 中找不到我的 GitLab CI 测试
- db2 - 在 DB2 for z 上通过 DB2 UNLOAD 实用程序使用常量
- python - Pytest-Django 不专门支持 Django 的 multi-db 并且失败 Database access not allowed
- encryption - 在 Laravel 中加密时如何为不同的用户使用不同的密钥?
- mysql - Mysql慢查询日志正在调用存储过程,如何查看实际的选择查询以便解释
- c# - 如何使用 Asp.Net 4.7 和带有 Microsoft.Extensions.DependencyInjection 的 DI 设置 Hangfire?
- php - 号码不会更改为下一个号码
- elasticsearch - 他们是一种我可以更新ignore_above字段而不删除我在elasticsearch中的索引的方法吗?