Php Symfony2多对多不在夹具中合并时保存
我在Symfony2中开发了一些装置,可以像cron一样工作,每5-10分钟启动一次。这是因为me应用程序依赖于不断变化的外部api 另一方面,api有一个完全不相关且没有意义的json响应,我不能相信每个调用中都会有所有的数据,因此我有许多可为空的字段,可以在下一个cron“maybe”上更新。我想处理它并将其存储在相关数据库中: 我有: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
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();
我尝试过的事情:
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]);
}
}
它正确地刷新了所有数据
希望它能帮助别人