Symfony не могу получить entity для relation поля в фикстуре
Не могу вытащить данные в entity из фикстуры.
Суть:
Есть
Entity/Player, у которой естьrelation ManyToOneкEntity/PlayerTypes. Данные дляPlayerTypesуже заведены в таблице. Когда создаетсяPlayer, нужно указатьPlayerType, сеттер типа игрока уEntity/Playerпринимает на входEntity/PlayerTypes.
Собственно, если бы я пользовался голым SQL, я бы просто вставил в запросе ID в виде цифры. Но доктрина сгенерировала мне сеттер который требует целую entity связанного класса на вход - как я понимаю такая философия orm, а потому решил вытаскивать его прямо в фикстуре в методе load(). И тут то все и заверте... ObjectManager упорно отказывается видеть данные в таблице, хотя в контроллере $playerType = $this->getDoctrine()->getRepository(PlayerTypes::class)->find(1); - все видит и оттуда игрок корректно создается.
Пробовал разные методы помимо find(), вплоть до написания собственного в репозитории - итог тот же. В контроллере все ОК, в фикстуре - ничего не находит.
Подозреваю, что дело в ObjectManager, но в чем конкретно - пока не могу сообразить. $playerType = $this->getDoctrine()->getRepository(PlayerTypes::class); - класс репозитория при этом возвращает.
Подскажите пожалуйста, куда копать и правильно ли вообще я работаю с фикстурами)?
Фикстура
use App\Entity\Players;
use App\Entity\PlayerTypes;
use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Persistence\ObjectManager;
class AppFixtures extends Fixture
{
public function load(ObjectManager $manager)
{
//всегда возвращает null, ходя данные с id = 1 точно есть
$playerType = $manager->getRepository(PlayerTypes::class)->find(1);
$player = new Players();
$player->setLogin('test');
$player->setFidPlayertype($playerType);
$manager->persist($player);
$manager->flush();
}
}
Ответы (2 шт):
Про правильность работы с фикстурами вы задались хорошим вопросом. Вкратце - вы не правильно работаете с фикстурами.
Для реализации связи между сущностями вам нужно использовать reference
Вот где это описано в документации
Разобрался. Бандл фикстур действительно очищает все данные перед загрузкой фикстуры как уже упоминал @Dmitry Kozlov, поэтому при запуске фикстуры в консоли, нужно указать название таблиц, которые не нужно очищать. В моем случае, всего то нужно было запускать фикстуру вот такой командой:
symfony console doctrine:fixtures:load --purge-exclusions=player_types