将数组映射到Symfony2/Doctrine2中的实体

将数组映射到Symfony2/Doctrine2中的实体,symfony,doctrine-orm,Symfony,Doctrine Orm,我使用DoctrineFixtures包在开发过程中创建示例实体。在我的ORM fixtures load()方法中,我将数据定义为关联数组,并在循环中创建实体对象 <?php // ... public function load($manager) { $roleDefs = array( 'role-1' => array( 'role' => 'administrator' ), 'rol

我使用DoctrineFixtures包在开发过程中创建示例实体。在我的ORM fixtures load()方法中,我将数据定义为关联数组,并在循环中创建实体对象

<?php
// ...
public function load($manager) {
    $roleDefs = array(
        'role-1' => array(
             'role' => 'administrator'
        ),
        'role-2' => array(
             'role' => 'user'
        ),
    );

    foreach($roleDefs as $key => $roleDef) {
        $role = new Role();
        $role->setRole($roleDef['role']);
        $manager->persist($role);

        $this->addReference($key, $role);
    }

    $manager->flush();
}
有人知道如何做到这一点吗

非常感谢,
Hacksteak

我有时在创建装置时使用循环。我不确定这个解决方案是否符合您的要求,但我发现,如果您需要,构建固定装置和快速添加新属性的最灵活的方法是执行以下操作。。。假设创建一堆博客帖子:

// an array of blog post fixture values
$posts = array(
    array(
        'title' => 'Foo',
        'text'  => 'lorem'
        'date'  => new \DateTime('2011-12-01'),
    ),
    array(
        'title' => 'Bar',
        'text'  => 'lorem'
        'date'  => new \DateTime('2011-12-02'),
    ),
    // more data...
);

// loop over the posts
foreach ($posts as $post) {
    // new entity
    $post = new Post();

    // now loop over the properties of each post array...
    foreach ($post as $property => $value) {
        // create a setter
        $method = sprintf('set%s', ucwords($property)); // or you can cheat and omit ucwords() because PHP method calls are case insensitive
        // use the method as a variable variable to set your value
        $post->$method($value);
    }

    // persist the entity
    $em->persist($post);
}

通过这种方式,只需将新值添加到数组中,就可以添加更多属性。

我现在使用的解决方案在en external类中进行了一些修改(支持下划线和add方法)。我以前见过这种解决方案,但我认为可以更灵活地解决此问题。内部补水器怎么样?我肯定对更灵活的解决方案感兴趣,所以我洗耳恭听!很高兴看到它,我想知道我的方法是否正确,我做同样的事情。当从数组中获取某个值时,该数组与我用来检查该方法的实体不一样,如果该方法与“method_exists()”一起存在。
// an array of blog post fixture values
$posts = array(
    array(
        'title' => 'Foo',
        'text'  => 'lorem'
        'date'  => new \DateTime('2011-12-01'),
    ),
    array(
        'title' => 'Bar',
        'text'  => 'lorem'
        'date'  => new \DateTime('2011-12-02'),
    ),
    // more data...
);

// loop over the posts
foreach ($posts as $post) {
    // new entity
    $post = new Post();

    // now loop over the properties of each post array...
    foreach ($post as $property => $value) {
        // create a setter
        $method = sprintf('set%s', ucwords($property)); // or you can cheat and omit ucwords() because PHP method calls are case insensitive
        // use the method as a variable variable to set your value
        $post->$method($value);
    }

    // persist the entity
    $em->persist($post);
}