我在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();
我尝试的事情:
选项2:
public function addRole(Role $roles)
{
$roles->addHero($this); // cascade error
$this->roles[] = $roles;
return $this;
}
我可能会原谅一些事情,即我在开发应用程序时学习symfony2。
感谢您的建议。
更新
如果我为持久化更改合并,则会保存多对多关系,但我无法使用相同的脚本进行更新。
有人可以解释为什么合并没有创造关系?
答案 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]);
}
}
它会正确刷新所有数据。
希望它有所帮助。