如何在DataFixture类中执行doctrine查询?

ilS*_*avo 7 fixtures symfony doctrine-orm

如何在DataFixture中访问EntityManager或存储库类以创建查询?

Nic*_*ich 12

如果您的fixture实现了ContainerAwareInterface您对容器的完全访问权限,并且可以从那里获得您的一个实体管理器.

一旦有了实体管理器,就可以使用DQL或querybuilder获取存储库或创建查询.

namespace Vendor\YourBundleBundle\DataFixtures\ORM;

use Doctrine\Common\DataFixtures\FixtureInterface;
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;

class LoadCharacterData implements FixtureInterface, ContainerAwareInterface
{
    private $container;

    public function setContainer(ContainerInterface $container = null)
    {
        $this->container = $container;
    }

    public function load()
    {
        $em = $this->container->get('doctrine')->getEntityManager('default');

        // example using DQL
        $query = $em->createQuery('SELECT u FROM YourBundle\Entity\User u WHERE u.name = your_name');
        $users = $query->getResult();

        // example query using repository
        $repository = $em->getRepository('YourBundle:User');
        $entities = $repository->findBy(array('name' => 'your_name'));

        // example using queryBuilder
        $qb = $repository->createQueryBuilder('u');
        $qb
            ->where('u.name = :name')
            ->setParameter('name', 'your_name')
            ->orderBy('u.name');

        $users = $qb->getQuery()->getResult();

        // ...

    }
Run Code Online (Sandbox Code Playgroud)

  • 为了将来参考,`EntityManager`(实现`ObjectManager`)作为方法加载中的第一个参数传递.您不需要实现`ContainerAwareInterface` (4认同)