繁体   English   中英

执行 SQL 在 Doctrine 夹具 Symfony 4

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM