【问题标题】:DataFixtures phpunit symfony Expected value of type got "integer" insteadDataFixtures phpunit symfony 类型的预期值改为“整数”
【发布时间】:2019-10-18 09:17:39
【问题描述】:

我正在使用 DataFixtures 和 phpunit ControllerTest 但是当我使用 phpunit 测试/BankBundle/Controller/BankControllerTest.php 我明白了

Doctrine\ORM\ORMInvalidArgumentException:关联字段“BankBundle\Entity\entry#$user”的类型为“BankBundle\Entity\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;
    }

}

实体 用户.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;
    }
}

【问题讨论】:

    标签: php symfony phpunit fixtures


    【解决方案1】:

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

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

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

    在您的 entry 类中,关系将是:

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

    注意您不需要反转属性,因此您也可以简单地更改您的 entry 类:

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

    倒置关系的好处是,如果添加getter,你可以一次性从用户那里获取所有条目:

    $user->getEntries();
    

    【讨论】:

      猜你喜欢
      • 2018-12-19
      • 1970-01-01
      • 2017-08-23
      • 1970-01-01
      • 2015-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多