DataFixtures phpunit symfony 类型的预期值得到了 "integer"

DataFixtures phpunit symfony Expected value of type got "integer" instead

我正在使用 DataFixtures 和 phpunit ControllerTest 但是当我使用 php单位tests/BankBundle/Controller/BankControllerTest.php 我得到

Doctrine\ORM\ORMInvalidArgumentException: Expected value of type "BankBundle\Entity\user" for association field "BankBundle\Entity\entry#$user", got "integer" instead.

我不知道怎么解决

这是我的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;
    }
}

您误解了 inversedBy 关系的运作方式。如果反转关系,则需要在包含相关实体的其他实体上有一个字段。这些应该是真实的实体,你不需要关心 id,因为 Doctrine 会处理它。

由于您有 manyToOne 关系,解决方案是在 user class 中添加一个 属性,例如:

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

而在您的 entry class 中,关系将是:

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

请注意,您不需要倒置的 属性,因此您也可以简单地更改 entry class:

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

反向关系的好处是,如果加上getter:

,就可以一次性从用户那里得到所有条目
$user->getEntries();