0

我想通过 Doctrine Fixtures 将一些 Sql 代码插入数据库。这是我的课。

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

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 课程。

4

2 回答 2

0

这是我在 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();
        }
    }
}
于 2021-02-02T15:36:26.197 回答
0

我已经添加

/**
 * @param EntityManagerInterface $manager
 */
public function loadData(ObjectManager $manager)
{
    $sql = '';

    /* @var EntityManagerInterface $manager */
    $manager->getConnection()->exec($sql);

    $manager->flush();
}

那正确吗?

于 2019-10-21T15:03:42.857 回答