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();
我正在使用 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();