我正在使用DataFixtures和phpunit ControllerTest 但是当我使用 phpunit tests / 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;
}
}
实体 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;
}
}
答案 0 :(得分: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;
反关系的优点是,如果添加吸气剂,您可以一次性从用户获得所有条目:
$user->getEntries();