Symfony2很多很多人没有在夹具中保存合并

时间:2014-08-09 08:14:15

标签: php symfony doctrine-orm

我在Symfony2中开发了一些Fixtures,就像crons一样,每5-10分钟就会启动一次。多数民众赞成我的申请取决于一个不断变化的外部api。

另一方面,api有一个完全不相关且没有意义的json响应,并且我不能相信所有数据都在每次调用中出现,所以我有许多可以为空的fiedls而不是可以在下一个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;
}

在我的夹具中,在连接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();

我尝试的事情:

  1. 更改订单,首先添加角色,然后合并
  2. 在$ hero-> addRole
  3. 上添加反向
  4. 放入cascasde {persist}
  5. 选项2:

    public function addRole(Role $roles)
    {
        $roles->addHero($this); // cascade error
        $this->roles[] = $roles;
    
        return $this;
    }
    

    我可能会原谅一些事情,即我在开发应用程序时学习symfony2。

    感谢您的建议。

    更新

    如果我为持久化更改合并,则会保存多对多关系,但我无法使用相同的脚本进行更新。

    有人可以解释为什么合并没有创造关系?

1 个答案:

答案 0 :(得分:0)

我几天前找到了解决方案,原谅回答这个问题:

我改变了这段代码:

// 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]);
    }
}

它会正确刷新所有数据。

希望它有所帮助。