Symfony2 выполняет SQL файл в Doctrine Fixtures Load
Я переношу старое веб-приложение на основе SQL Server и ASP на Symfony2 и MySQL. Я сделал несколько запросов и экспортировал старые данные в отдельные файлы SQL.
Как я могу выполнить файлы thoses в моих светильниках, когда я запускаю команду
$php app/console doctrine:fixtures:load
Теперь у меня есть некоторые инструменты, которые работают непосредственно с ORM и сущностями Doctrine, но у меня есть много данных для импорта.
Ответы
Ответ 1
Я нахожу хорошее решение. Я не нашел метод exec
в классе ObjectManager
, поэтому... это очень хорошо работает для меня.
public function load(ObjectManager $manager)
{
// Bundle to manage file and directories
$finder = new Finder();
$finder->in('web/sql');
$finder->name('categories.sql');
foreach( $finder as $file ){
$content = $file->getContents();
$stmt = $this->container->get('doctrine.orm.entity_manager')->getConnection()->prepare($content);
$stmt->execute();
}
}
В этом решении ваш класс fixture должен реализовать ContainerAwareInterface
с помощью метода
public function setContainer( ContainerInterface $container = null )
{
$this->container = $container;
}
Ответ 2
Вы можете загрузить содержимое файла в виде строки и выполнить собственный SQL с помощью EntityManager:
class SQLFixtures extends AbstractFixture implements OrderedFixtureInterface
{
$filename = '/path/to/sql/file.sql';
public function load(ObjectManager $manager) {
$sql = file_get_contents($filename); // Read file contents
$manager->getConnection()->exec($sql); // Execute native SQL
$manager->flush();
}
public function getOrder() {
return 99; // Order in which this fixture will be executed
}
}
Ответ 3
Ответ на Zend Framework 2.5.3 с помощью Doctrine Data-Fixtures.
Не уверен, что это относится к данным ответам, но они слишком стараются. Если вы проверите данный объект $manager
, вы обнаружите, что он уже есть EntityManager
(из interface ObjectManager
) (по крайней мере, в ZF2). Таким образом, вы можете напрямую получить Connection
и выполнить его без использования $this->container->get('doctrine.orm.entity_manager')
Ниже фрагмента, который я использую для создания первой "системы" пользователя, с ссылкой createdBy
FK на себя.
public function load(ObjectManager $manager)
{
$sql = 'INSERT INTO users (
id, username, email, display_name, `password`, created_by)
VALUES (:id, :username, :email, :display_name, :password, :created_by)';
$password = $this->createSuperDuperEncryptedPassword();
// $manager === `EntityManager|ObjectManager`, `->getConnection()` is available
$stmt = $manager->getConnection()->prepare($sql);
$stmt->bindValue(':id', 1);
$stmt->bindValue(':username', 'system');
$stmt->bindValue(':email', '[email protected]');
$stmt->bindValue(':display_name', 'system');
$stmt->bindValue(':password', password );
$stmt->bindValue(':created_by', 1); // Self reference
$stmt->execute();
}