DataFixtures phpunit symfony Ожидаемое значение типа вместо "integer" - PullRequest
1 голос
/ 18 октября 2019

Я использую DataFixtures и phpunit ControllerTest, но когда я использую phpunit tests / BankBundle / Controller / BankControllerTest.php Я получаю

Doctrine \ ORM \ ORMInvalidArgumentException: ожидаемое значениевведите «BankBundle \ Entity \ user» для поля ассоциации «BankBundle \ Entity \ entry # $ user», вместо этого получил «integer».

Я не знаю, как это исправить

это мой DataFixtures.php

<?php

namespace BankBundle\DataFixtures;

use BankBundle\Entity\entry;
use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Common\DataFixtures\FixtureInterface;
use Doctrine\Common\Persistence\ObjectManager;

class BankFixtures implements FixtureInterface
{
    public function load(ObjectManager $manager)
    {
        $bank = new entry();
        $bank->setUser(123);
        $manager->persist($bank);
        $manager->flush();
    }
}

сущность entry.php

class entry
{
    /**
     * @ORM\Id
     * @ORM\Column(name="id",type="integer")
     * @ORM\GeneratedValue
     */
    private $id;
    /**
     * @ORM\ManyToOne(targetEntity="user", inversedBy="id")
     */
    private $user;

    public function getUser()
    {
        return $this->user;
    }
    public function setUser($user)
    {
        $this->user = $user;
    }

}

сущность user.php

class user
{
    /**
     * @ORM\Id
     * @ORM\Column(name="id",type="integer")
     * @ORM\GeneratedValue
     */
    private $id;
    /**
     * @ORM\Column(name="balance",type="integer")
     */
    private $balance;

    public function getId()
    {
        return $this->id;
    }

    public function getBalance()
    {
        return $this->balance;
    }

    public function setId($id)
    {
        $this->id = $id;
    }

    public function setBalance($balance)
    {
        $this->balance = $balance;
    }
}

1 Ответ

1 голос
/ 18 октября 2019

Вы неправильно понимаете, как работают отношения inversedBy. Если вы изменяете отношение, вам нужно поле для другого объекта, содержащего связанные объекты. Это должны быть реальные сущности, вам не нужно беспокоиться об идентификаторах, так как Doctrine позаботится об этом.

Поскольку у вас есть отношение manyToOne, решением будет добавить свойство в * 1005. * класс как:

/**
 * @ORM\OneToMany(targetEntity="entry", mappedBy="user")
 */
private $entries;

И в вашем entry классе отношения будут такими:

/**
 * @ORM\ManyToOne(targetEntity="user", inversedBy="entries")
 */
private $user;

Обратите внимание , что вам не нужно обратное свойство,так что вы также можете просто изменить свой entry класс:

/**
 * @ORM\ManyToOne(targetEntity="user")
 */
private $user;

Преимущество обратного отношения состоит в том, что вы можете получить все записи за один раз от пользователя, если добавите метод получения:

$user->getEntries();
...