Php Symfony2多对多不在夹具中合并时保存

Php Symfony2多对多不在夹具中合并时保存,php,symfony,doctrine-orm,Php,Symfony,Doctrine Orm,我在Symfony2中开发了一些装置,可以像cron一样工作,每5-10分钟启动一次。这是因为me应用程序依赖于不断变化的外部api 另一方面,api有一个完全不相关且没有意义的json响应,我不能相信每个调用中都会有所有的数据,因此我有许多可为空的字段,可以在下一个cron“maybe”上更新。我想处理它并将其存储在相关数据库中: 我有: class Hero { /** * @ORM\ManyToMany(targetEntity="Role", inversedBy="heroe

我在Symfony2中开发了一些装置,可以像cron一样工作,每5-10分钟启动一次。这是因为me应用程序依赖于不断变化的外部api

另一方面,api有一个完全不相关且没有意义的json响应,我不能相信每个调用中都会有所有的数据,因此我有许多可为空的字段,可以在下一个cron“maybe”上更新。我想处理它并将其存储在相关数据库中:

我有:

class Hero
{
  /**
   * @ORM\ManyToMany(targetEntity="Role", inversedBy="heroes")
   * @ORM\JoinTable(name="heroes_roles")
   **/
  private $roles;
}

class Role
{
  /**
   * @ORM\ManyToMany(targetEntity="Hero", mappedBy="roles")
   **/
  private $heroes;
}
在me fixture中,连接api并从json获取数据后:

// Roles
$rolesRepository = $manager->getRepository('ProjectStoreBundle:Role');
$rolesIndexedByName = $rolesRepository->getIndexedBy('name');

// Json con info de los heroes
$heroesInfo = json_decode(file_get_contents($this->kernel->locateResource('@ProjectStoreBundle/Resources/doc/heroes_info.json')));

foreach ($array_response['result']['heroes'] as $apiHero) {
   $hero = new Hero();
   $hero->setId($apiHero['id']);
   $hero->setName($apiHero['name']);
   ...// more normal sets

   // Update it if exists
   $manager->merge($hero);

   // Add his roles
   foreach ($heroesInfo->$apiHero['name']->roles as $role) {
        if (!empty($rolesIndexedByName[$role])) {
           $hero->addRole($rolesIndexedByName[$role]);
        }
   }
}
$manager->flush();
我尝试过的事情:

  • 更改顺序,首先添加角色,然后合并
  • 在$hero->addRole上添加反向
  • 放置cascasde{persist}
  • 备选案文2:

    public function addRole(Role $roles)
    {
        $roles->addHero($this); // cascade error
        $this->roles[] = $roles;
    
        return $this;
    }
    
    我可能会原谅一些事情,我在开发应用程序时正在学习symfony2

    谢谢你的建议

    更新

    如果将“合并”更改为“持续”,则会保存多对多关系,但无法使用相同的脚本进行更新


    有人可以向我解释为什么合并不能创建关系?

    我几天前找到了解决方案,请原谅我回答以下问题:

    我只更改了这段代码:

    // Update it if exists
    $manager->merge($hero);
    
    // Add his roles
    foreach ($heroesInfo->$apiHero['name']->roles as $role) {
        if (!empty($rolesIndexedByName[$role])) {
           $hero->addRole($rolesIndexedByName[$role]);
        }
    }
    
    为此:

    // Update it if exists
    $mergedHero = $manager->merge($hero);
    
    // Add his roles
    foreach ($heroesInfo->$apiHero['name']->roles as $role) {
        if (!empty($rolesIndexedByName[$role])) {
           $mergedHero->addRole($rolesIndexedByName[$role]);
        }
    }
    
    它正确地刷新了所有数据

    希望它能帮助别人