[英]Execute SQL in Doctrine Fixtures Symfony 4
我想通过 Doctrine Fixtures 将一些 Sql 代码插入数据库。 这是我的 class。
class ProvinceFixtures extends BaseFixtures
{
public function loadData(ObjectManager $manager)
{
$sql = '
INSERT INTO `province` (`id`, `name`, `created_at`, `updated_at`) VALUES
(1, \'TP Đà Nẵng\', \'2019-07-09 08:45:02\', \'2019-07-09 08:45:02\'),
(2, \'TP Hà Nội\', \'2019-07-09 08:45:02\', \'2019-07-09 08:45:02\'),
(3, \'TP Hải Phòng\', \'2019-07-09 08:45:02\', \'2019-07-09 08:45:02\');
';
/* @var EntityManagerInterface $manager */
$manager->getConnection()->exec($sql);
$manager->flush();
}
}
但是当我运行doctrine:fixtures:load
时,我的终端会显示此日志。
Call to an undefined method Doctrine\Common\Persistence\ObjectManager::getConnection().
我该如何解决。 谢谢你。
*更新: BaseFixture
class
abstract class BaseFixtures extends Fixture
{
/** @var Generator */
protected $faker;
/** @var ObjectManager */
private $manager;
private $referencesIndex = [];
abstract protected function loadData(ObjectManager $manager);
public function __construct()
{
$this->faker = Factory::create();
}
public function load(ObjectManager $manager)
{
$this->manager = $manager;
$this->faker = Factory::create();
$this->loadData($manager);
}
protected function createMany(string $className, int $count, callable $factory)
{
for ($i = 0; $i < $count; ++$i) {
$entity = new $className();
$factory($entity, $i);
$this->manager->persist($entity);
// store for usage later as App\Entity\ClassName_#COUNT#
$this->addReference($className.'_'.$i, $entity);
}
}
}
我更新了我的 BaseFixture class。
我已经添加
/**
* @param EntityManagerInterface $manager
*/
public function loadData(ObjectManager $manager)
{
$sql = '';
/* @var EntityManagerInterface $manager */
$manager->getConnection()->exec($sql);
$manager->flush();
}
那正确吗?
这是我在 symfony 5.2 中导入多个 sql 文件的解决方案:
namespace App\DataFixtures;
use Doctrine\DBAL\Exception;
use Doctrine\Persistence\ObjectManager;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Finder\Finder;
class ImportSqlFixtures extends BaseFixture
{
/**
* @param ObjectManager $manager
* @throws Exception
*/
public function loadData(ObjectManager $manager)
{
// Bundle to manage file and directories
$finder = new Finder();
$finder->in(__DIR__.'/sql');
$finder->name('*.sql');
$finder->files();
$finder->sortByName();
/* @var EntityManagerInterface $manager */
$connection = $manager->getConnection();
foreach ($finder as $file) {
echo " Importing: {$file->getBasename()} ".PHP_EOL;
$sql = $file->getContents();
$connection->executeQuery($sql); // Execute native SQL
$manager->flush();
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.