首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将数组映射到Symfony2/Doctrine2中的实体

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

Stack Overflow用户
提问于 2011-12-10 21:08:28
回答 1查看 14.1K关注 0票数 8

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

代码语言:javascript
复制
<?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();
}

我总是使用相同的数组模式。每个数组元素使用实体的属性名(下划线表示法)作为索引。如果实体结构变得更加复杂,则会有很多$entity->setMyProperty($def['my_property']);行。

我认为将属性名映射到setter方法的问题在Symfony和Doctrine中是一个非常常见的问题,因为这种类型的映射在许多情况下都存在(例如,将表单映射到实体)。

现在我想知道是否有一个内置的方法可以用于映射。如果有一个像这样的解决方案就好了。

代码语言:javascript
复制
foreach($defs as $key => $def) {
   $entity = $magicMapper->getEntity('MyBundle:MyEntity', $def);
   // ...
}

有没有人知道如何实现这一点?

非常感谢,Hacksteak

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-12-11 03:12:59

在创建fixture时,我有时会使用循环。我不确定这个解决方案是否适合您的需求,但我发现构建fixture并根据需要随着时间的推移快速添加新属性的最灵活方法是执行以下操作...假设创建了一组博客帖子:

代码语言:javascript
复制
// 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);
}

这样,您只需将新值添加到数组中,即可添加更多属性。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8456693

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档