2016-01-14 25 views
1

我一直是LoadAdvert類的ContainerAwareInterface,所以我可以調用並使用EntityManager來檢索數據庫中的用戶。如何使用doctrine fixtures在db中獲取實體?

然而,php執行斌/控制檯教義時:固定裝置:負載,實體管理器只檢索一個空數組,因爲如果有在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

你試圖做什麼?你知道教義數據裝置是什麼嗎? – malcolm

+0

我試圖讓所有的用戶,並將它們插入到數據庫之前使用它們來補充我的廣告。 – Cachwir

+0

你的課堂應該延伸'使用Symfony \ Bundle \ FrameworkBundle \ Controller \ Controller;'? – fcpauldiaz

回答

1

這裏是我如何做到這一點。主要是爲您創建的用戶對象設置引用,然後在其他fixture文件中調用它並將它們分配給相關對象。同樣重要的是執行夾具數據的順序。加載用戶之前,您無法加載相關對象。

` 命名空間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文件你不打電話的用戶,你從數據庫中所做的,像這樣做:

'
$筆者= $這個 - > getReference(用戶 'user1') ;

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

`

,然後你這個$author對象添加到相關對象。

請注意,在article燈具中執行OrderedFixtureInterface,並將getOrder()設置爲比users更高。

+0

Purrfect!謝謝,茲德勳爵! – Cachwir

+0

沒問題,很高興我能幫到你。 –

相關問題