Je suppose que vous voulez utiliser luminaires (et pas seulement de vidage de la production ou de la mise en scène de la base de données dans la base de données de développement) a) parce que vos modifications de schéma et les décharges ne fonctionnerait pas si vous mettez à jour votre code ou b) vous ne voulez pas vider le trou de la base de données mais qui ne veulent étendre certaines installations personnalisées. Un exemple est, je pense: vous avez 206 pays dans votre mise en scène de la base de données et les utilisateurs d'ajouter des villes de ces pays, afin de conserver les appareils petits, vous ne disposez que de 5 pays dans le développement de votre base de données, toutefois, vous souhaitez ajouter des villes que l'utilisateur ajoute à ces 5 pays dans la mise en scène de la base de données pour le développement de la base de données
La seule solution que je vois est d'utiliser le mentionné DoctrineFixturesBundle et plusieurs gestionnaires d'entités.
Tout d'abord, vous devez configurer deux connexions de base de données et de deux gestionnaires de l'entité dans votre config.yml
doctrine:
dbal:
default_connection: default
connections:
default:
driver: %database_driver%
host: %database_host%
port: %database_port%
dbname: %database_name%
user: %database_user%
password: %database_password%
charset: UTF8
staging:
...
orm:
auto_generate_proxy_classes: %kernel.debug%
default_entity_manager: default
entity_managers:
default:
connection: default
mappings:
AcmeDemoBundle: ~
staging:
connection: staging
mappings:
AcmeDemoBundle: ~
Comme vous pouvez le voir à la fois les gestionnaires de l'entité de la carte le AcmeDemoBundle (dans ce bundle, je vais mettre le code pour charger les appareils). Si la deuxième base de données n'est pas sur votre machine de développement, vous avez juste à vider le SQL à partir de l'autre machine pour la machine de développement. Cela devrait être possible puisque nous parlons de 500 lignes et non sur des millions de lignes.
Ce que vous pouvez faire est de mettre en œuvre un dispositif de fixation, chargeur qui utilise le service de conteneur pour récupérer la seconde entité gestionnaire et de la Doctrine de l'usage pour interroger les données de la deuxième base de données et l'enregistrer dans votre base de données de développement (l' default
gestionnaire d'entité):
<?php
namespace Acme\DemoBundle\DataFixtures\ORM;
use Doctrine\Common\DataFixtures\FixtureInterface;
use Doctrine\Common\Persistence\ObjectManager;
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Acme\DemoBundle\Entity\City;
use Acme\DemoBundle\Entity\Country;
class LoadData implements FixtureInterface, ContainerAwareInterface
{
private $container;
private $stagingManager;
public function setContainer(ContainerInterface $container = null)
{
$this->container = $container;
$this->stagingManager = $this->container->get('doctrine')->getManager('staging');
}
public function load(ObjectManager $manager)
{
$this->loadCountry($manager, 'Austria');
$this->loadCountry($manager, 'Germany');
$this->loadCountry($manager, 'France');
$this->loadCountry($manager, 'Spain');
$this->loadCountry($manager, 'Great Britain');
$manager->flush();
}
protected function loadCountry(ObjectManager $manager, $countryName)
{
$country = new Country($countryName);
$cities = $this->stagingManager->createQueryBuilder()
->select('c')
->from('AcmeDemoBundle:City', 'c')
->leftJoin('c.country', 'co')
->where('co.name = :country')
->setParameter('country', $countryName)
->getQuery()
->getResult();
foreach ($cities as $city) {
$city->setCountry($country);
$manager->persist($city);
}
$manager->persist($country);
}
}
Ce que j'ai fait dans l' loadCountry
méthode a été que j'ai charger les objets de la staging
gestionnaire d'entités, ajouter une référence à l'appareil de pays (celui qui existe déjà dans votre accessoires) et persistent à l'aide de l' default
gestionnaire d'entité (le développement de votre base de données).
Sources: