我正在使用DataFixtures和phpunit ControllerTest 但是当我使用phpunit tests/BankBundle/Controller/BankControllerTest.php我得到
Doctrine\ORM\ORMInvalidArgumentException:关联字段"BankBundle\Entity\entry#$user"的预期值为"BankBundle\Entity\user",改为"整数"。
我不知道如何解决它
这是我的数据夹具.php
<?php
namespace BankBundleDataFixtures;
use BankBundleEntityentry;
use DoctrineBundleFixturesBundleFixture;
use DoctrineCommonDataFixturesFixtureInterface;
use DoctrineCommonPersistenceObjectManager;
class BankFixtures implements FixtureInterface
{
public function load(ObjectManager $manager)
{
$bank = new entry();
$bank->setUser(123);
$manager->persist($bank);
$manager->flush();
}
}
实体 条目.php
class entry
{
/**
* @ORMId
* @ORMColumn(name="id",type="integer")
* @ORMGeneratedValue
*/
private $id;
/**
* @ORMManyToOne(targetEntity="user", inversedBy="id")
*/
private $user;
public function getUser()
{
return $this->user;
}
public function setUser($user)
{
$this->user = $user;
}
}
实体 用户.php
class user
{
/**
* @ORMId
* @ORMColumn(name="id",type="integer")
* @ORMGeneratedValue
*/
private $id;
/**
* @ORMColumn(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
关系是如何运作的。如果反转关系,则需要在包含相关实体的其他实体上提供一个字段。这些应该是真实的实体,你不需要关心ids,因为教义会照顾到这一点。
由于您具有manyToOne
关系,因此解决方案是在user
类中添加一个属性,例如:
/**
* @ORMOneToMany(targetEntity="entry", mappedBy="user")
*/
private $entries;
在你的entry
课上,关系将是:
/**
* @ORMManyToOne(targetEntity="user", inversedBy="entries")
*/
private $user;
请注意,您不需要反转属性,因此您也可以简单地更改entry
类:
/**
* @ORMManyToOne(targetEntity="user")
*/
private $user;
反转关系的优点是,如果添加 getter,您可以一次性从用户那里获取所有条目:
$user->getEntries();