Как получить сущности в БД при использовании учений доктрины?

1

Я был ContainerAwareInterface в моем классе LoadAdvert, поэтому я могу вызвать и использовать EntityManager для извлечения пользователей в базе данных.

Однако при выполнении доктрины php bin/console: fixtures: load диспетчер объектов извлекает только пустой массив, как будто в db не было пользователя.

<?php
// src/OC/PlatformBundle/DataFixtures/ORM/LoadCategory.php

namespace OC\PlatformBundle\DataFixtures\ORM;

use Doctrine\Common\DataFixtures\FixtureInterface;
use Doctrine\Common\Persistence\ObjectManager;
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use OC\PlatformBundle\Entity\Advert;
use OC\UserBundle\Entity\User;

   class LoadAdvert implements FixtureInterface, ContainerAwareInterface
    {
      /**
       * @var ContainerInterface
       */
      private $container;

      public function setContainer(ContainerInterface $container = null)
      {
        $this->container = $container;
      }

      // Dans l'argument de la méthode load, l'objet $manager est l'EntityManager
      public function load(ObjectManager $manager)
      {
        $em = $this->container->get('doctrine.orm.entity_manager');
        $author = $em->getRepository('OCUserBundle:User')->findAll();

        die(var_dump($author));
  • 0
    Что вы пытаетесь сделать? Знаете ли вы, что означает доктрина данных?
  • 0
    Я пытаюсь собрать всех пользователей и использовать их для увлажнения моих объявлений, прежде чем вставлять их в БД.
Показать ещё 4 комментария
Теги:
doctrine
doctrine2

1 ответ

1
Лучший ответ

Вот как я это делаю. Главное - установить ссылку на созданные пользователем объекты, а затем вызвать их в другом файле прибора и назначить их связанным объектам. Также важным является порядок выполнения данных прибора. Объект, связанный с нагрузкой, перед загрузкой пользователей.

'пространство имен AcmeBundle\DataFixtures\ORM;

use Doctrine\Common\DataFixtures\AbstractFixture;
use Doctrine\Common\DataFixtures\OrderedFixtureInterface;
use Doctrine\Common\Persistence\ObjectManager;
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;

class LoadUserData extends AbstractFixture implements OrderedFixtureInterface, ContainerAwareInterface
{
    /** @var  ContainerInterface */
    private $container;

    /**
     * Load data fixtures with the passed EntityManager
     *
     * @param ObjectManager $manager
     */
    public function load(ObjectManager $manager)
    {
        $userManager = $this->container->get('fos_user.user_manager');

        $user1 = $userManager->createUser();
        $user1->setUsername('username1');
        $user1->setPlainPassword('123');
        $user1->setEmail('[email protected]');
        $user1->setEnabled(true);


        $user2 = $userManager->createUser();
        $user2->setUsername('username2');
        $user2->setPlainPassword('123');
        $user1->setEmail('[email protected]');
        $user2->setEnabled(true);

        $manager->persist($user1);
        $manager->persist($user2);

        $this->setReference('user1', $user1);
        $this->setReference('user2', $user2);

        $manager->flush();
    }

    /**
     * Get the order of this fixture
     *
     * @return integer
     */
    public function getOrder()
    {
        return 1;
    }

    /**
     * Sets the Container. Need it to create new User from fos_user.user_manager service
     *
     * @param ContainerInterface|null $container A ContainerInterface instance or null
     */
    public function setContainer(ContainerInterface $container = null)
    {
        $this->container = $container;
    }
}

'Тогда в другом файле fixture вы не вызываете пользователя, как вы делали из базы данных, вы делаете это так:

'
$ author = $this-> getReference ('user1');

 $article = new Article();
 $article->addAuthor($author);

'

и затем вы добавляете этот объект $author к связанному объекту.

Имейте в виду реализовать OrderedFixtureInterface в этой article и установить getOrder() на большее число, чем для users.

  • 0
    Purrfect! Большое спасибо, лорд Зед!
  • 0
    Нет проблем, рад, что смог помочь.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню