2013-02-21 3 views
0

Vous ne savez pas si c'est possible ou non, mais je cherche à créer une collection de doctrine à partir d'une requête. L'idée est de peupler la collection avec des valeurs prédéfinies afin que je puisse mettre à jour la base de données comme une importation/générer des utilisateurs à partir d'un ancien système dans un nouveau système. Je suis aux prises avec le bit du référentiel.symfony2 create doctrine collection à partir de la requête

Entité

// Portal\UserBundle\Entity\User.php 

namespace Portal\UserBundle\Entity; 
use Doctrine\ORM\Mapping AS ORM; 


/** 
* @ORM\Entity 
*/ 
class User 
{ 
    /** 
    * @ORM\Id 
    * @ORM\Column(type="integer") 
    */ 
    private $id; 

    /** 
    * @ORM\Column(type="string", length=255, nullable=false) 
    */ 
    private $fistname; 

    /** 
    * Get id 
    * 
    * @return integer 
    */ 
    public function getId() 
    { 
     return $this->id; 
    } 

    // etc... 
} 

dépôt

namespace Portal\UserBundle\Entity\Repository; 
use Doctrine\ORM\EntityRepository; 

class UserRepository extends EntityRepository 
{ 
    public function getGenerateNewUsers() 
    { 
    // acts as an import from an old user table 
    $sql = " SELECT firstname, surname, other FROM old_user_table "; 

    $userCollection = .... not sure how I link query? 
    return $userCollection;  

    } 
} 

Appeler à l'intérieur du contrôleur

Avec ce qui précède, je l'intention d'être en mesure d'aller chercher la boucle d'utilisateurs nouvellement généré sur eux et ont acce ss aux objets mes méthodes d'entité, etc.

class SetupController extends Controller 
{ 
    public function indexAction(){ 

     $repository = this->getDoctrine()->getRepository('UserBundle:User'); 

     $newUsers = $repository->getGenerateUsers(); 

     // I can now have access to the users with something like 

     foreach($newUsers as $user){ 
      $user->setFirstName('testing'); 
      $user->save(); 
     } 

    } 
} 
+0

Avez-vous regardé http://symfony.com/doc/current/bundles/DoctrineFixturesBundle/index.html? – cheesemacfly

+0

merci pour le lien mais j'aimerais quand même pouvoir générer l'objet doctrine directement à partir d'une requête? il serait bon de savoir comment le faire. –

Répondre

1

Il est généralement le cas avec les importations comme celui-ci que votre table héritage ne correspond pas directement à votre nouveau (en termes de noms de champs, contraintes, etc.), et peut pas même être dans le même SGBD, donc vraiment la meilleure option est une approche légèrement manuelle. Exécutez la requête SQL sur votre base de données existante dans votre ancienne manière préférée pour obtenir vos utilisateurs sous forme de tableaux simples, puis boucle à travers eux et de créer des entités:

//Set up an empty collection 
$collection = new ArrayCollection(); 

/*Assuming PDO where you have set up and executed a PDO statement $pdoStatement, 
    but mysql_fetch_assoc or whatever is appropriate for your DBMS would work equally 
    well. $oldUser should just be a plain associative array*/ 

while($oldUser = $pdoStatement->fetch(PDO::FETCH_ASSOC)){ 
    //Initialise an empty User entity 
    $newUser = new User(); 

    //Set the properties on the entity using the values from your array 
    $newUser->setFirstName($oldUser['firstname']); 
    //etc 

    //Add your user to the collection 
    $collection->add($newUser); 
} 

return $collection 

Je remarque que vous pensez d'appeler save() sur votre User objets dans votre contrôleur, mais cela ne fonctionne généralement pas de cette façon dans Doctrine car vos entités seront des objets simples qui n'hériteront de rien et qui n'ont pas de méthodes spéciales. Le moyen de sauvegarder l'entité dans votre nouvelle base de données est de saisir le entity manager et d'appeler sa méthode persist.

Dans votre contrôleur:

$entityManager = $this->get('Doctrine')->getManager(); 
foreach($users as $user){ 
    //Manipulate the user here if you need to 

    //Then persist it 
    $entityManager->persist($user); 
} 

En aparté - si l'on voulait obtenir une collection d'entités en exécutant une requête sur votre nouvelle base de données qui est un problème légèrement différent auquel il est beaucoup plus élégant Solution. Doctrine Query Language vous permet d'interroger votre base de données de manière SQL tout en utilisant la langue de vos objets. Avec DQL, les résultats de vos requêtes seront par défaut hydrated dans les Entités Doctrine.

1

Hogan mentionne DQL. Voici à quoi cela ressemblerait, mais vous devriez vous assurer que votre ancienne base de données était câblée. Le résultat est une collection d'entités, à partir de laquelle vous pouvez utiliser des appels de méthode pour stocker une partie ou la totalité des données comme bon vous semble.

namespace Portal\UserBundle\Entity\Repository; 
use Doctrine\ORM\EntityRepository; 

class UserRepository extends EntityRepository 
{ 
    public function getGenerateNewUsers() 
    { 
    $qb = $this->getEntityManager() 
       ->getRepository('Bundle:Old_User')->createQueryBuilder('o'); 
    $query = $qb->getQuery(); 
    $results = $query->getResult(); 

    return $results;  
    } 
} 
+0

Cela semble bon. Qu'est-ce que Bundle: Old_User est-ce quelque chose que je dois créer - dois-je créer un bundle et une entité? Peut-il être sauté? –

+0

Vous devez définir old_user comme une entité du regroupement avec les utilisateurs actuels. – Lighthart

Questions connexes