A new entity was found through the relationship

253
10 октября 2018, 00:40

Пишу тесты для приложения на symfony, в нем есть консольная команда которая запускает множество методов, которые берут сущности из базы, циклично отправляют запросы на сторонние API, и в результате записывают некие данные назад в базу. Когда я запускал эту команду то все работало, в тестах же я вызываю эти методы по отдельности, а сущности создаю перед тестими в DataFixtures а уже в естах вытягиваю так:

self::$campaign = self::$kernel->getContainer()->get('doctrine')
            ->getRepository(Campaign::class)
            ->findOneBy(['name' => 'Test campaign for sync 1']);

тест:

public function testCreateCampaign(): void
    {
        $fbCampaign = self::$campaignService->create(self::$campaign);
        $this->assertInstanceOf(FCampaign::class, $fbCampaign);
        $this->assertEquals(self::$campaign->getUser()->getCompany()->getName() . '/Test campaign for sync 1', $fbCampaign->getData()[CampaignFields::NAME]);
        $this->assertEquals(true, $this->seeInDatabase(CampaignChannels::class, ['facebookCampaignId' => $fbCampaign->getData()[CampaignFields::ID]]));
    }

но тут уже не работает а выдаёт ошибки типа:

Doctrine\ORM\ORMInvalidArgumentException : A new entity was found through the relationship 'CampaignBundle\Entity\CampaignChannels#campaign' that was not configured to cascade persist operations for entity: CampaignBundle\Entity\Campaign@000000003d9037ca000000005eb33dc7. To solve this issue: Either explicitly call EntityManager#persist() on this unknown entity or configure cascade persist this association in the mapping for example @ManyToOne(..,cascade={"persist"}). If you cannot find out which entity causes the problem implement 'CampaignBundle\Entity\Campaign#__toString()' to get a clue.

/**
 * @var CampaignChannels[]
 *
 * @ORM\OneToMany(targetEntity="CampaignBundle\Entity\CampaignChannels", mappedBy="campaign")
 */
private $channels;

   /**
     * @var Campaign
     *
     * @ORM\ManyToOne(targetEntity="CampaignBundle\Entity\Campaign", inversedBy="channels")
     * @ORM\JoinColumn(name="campaign_id", referencedColumnName="id")
     */
    private $campaign;

метод который тестируется:

public function create(Campaign $campaign): FCampaign
{
    $fbCampaign = new FCampaign(null, 'act_' . $this->facebook->getAccountId());
    $fbCampaign->setData([
        CampaignFields::NAME => $this->getCampaignName($campaign),
        CampaignFields::OBJECTIVE => CampaignObjectiveValues::LINK_CLICKS
    ]);
    try {
        $fbCampaign->create([
            FCampaign::STATUS_PARAM_NAME => FCampaign::STATUS_ACTIVE,
        ]);
    } catch (\Exception $ex) {
        $this->saveErrors($ex, null, $campaign->getId());
        throw $ex;
    }
    $channel = $campaign->getFacebookChannel();
    $channel->setFacebookCampaignId($fbCampaign->getData()[CampaignFields::ID]);
    $channel->setLastSync(time());
    $this->objectManager->persist($channel);
    $this->objectManager->flush();
    return $fbCampaign;
}

Ещё один ньюанс - до того как я создавал мои сущности в DataFixtures я их создавал прямо в методе setUpBeforeClass(), сохранял в статические переменные и оттуда вызывал - и все работало, но после того как перенес в DataFixtures работать перестало, хотя сами методы что я тестирую никак не редактировал

Answer 1

Вы не вызвали persist для вновь созданной сущности Campaign.

To solve this issue: Either explicitly call EntityManager#persist() on this unknown entity or configure cascade persist this association in the mapping for example @ManyToOne(..,cascade={"persist"}).

Варианта решения 2:

  • найти сущность и вызвать $em->persist($campaign) для неё.
  • настроить каскадное выполнение persist, если сущность была создана, как зависимость другой сущности, которой Вы persist вызываете.
Answer 2

Измените связь:

/**
 * @var CampaignChannels[]
 *
 * @ORM\OneToMany(targetEntity="CampaignBundle\Entity\CampaignChannels", mappedBy="campaign", cascade={"persist"})
 */
private $channels;
READ ALSO
File(Image) on edit form Symfony 4

File(Image) on edit form Symfony 4

столкнулся с проблемой что при редактировании записи с загруженным изображением, оно отсуствует и приходится заного загружать, не делоДелал...

183
Не находится нужный шаблон в теме

Не находится нужный шаблон в теме

Есть тема DFD Native для wordpress, там есть тип страниц - портфолиоЕсли создать страницу с таким урл - http://sitename

237
Не отображается изображение

Не отображается изображение

Если закомментировать header, то выведется символы изображения

171
Как из ответа json выводить только баланс

Как из ответа json выводить только баланс

Приходит ответ от сервера в формате json, надо вывести только баланс, как это сделать ?

160