在持久化和刷新对象及其关联时收到以下错误消息:
Catchable Fatal Error: Argument 1 passed to
Doctrine'Common'Collections'ArrayCollection::__construct() must be of
the type array, object given, called in
.../vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php on line 519 and defined in
.../vendor/doctrine/common/lib/Doctrine/Common/Collections/ArrayCollection.php line 48
我有一个单表继承,这个作为基对象:
use Doctrine'ORM'Mapping as ORM;
/**
* ObjectData
*
* @ORM'Table(name="object_data")
* @ORM'Entity(repositoryClass="Edexp'CoreBundle'Entity'ObjectDataRepository")
* @ORM'InheritanceType("SINGLE_TABLE")
* @ORM'DiscriminatorColumn(name="entity_name", type="string")
* @ORM'DiscriminatorMap({
* "request" = "Edexp'MessageBundle'Entity'RequestData"
* })
* @ORM'HasLifecycleCallbacks
*/
class ObjectData
{
/**
* @var integer
*
* @ORM'Column(name="id", type="integer")
* @ORM'Id
* @ORM'GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var 'DateTime
*
* @ORM'Column(name="created_at", type="datetime")
*/
private $created_at;
/**
* @var User
*
* @ORM'OneToMany(targetEntity="User", mappedBy="data")
*/
private $user;
/**
* @var string
*
* @ORM'Column(name="`key`", type="string", length=255)
*/
private $key;
/**
* @var string
*
* @ORM'Column(name="data", type="blob")
*/
private $data;
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set created_at
*
* @param 'DateTime $createdAt
* @return ObjectData
*/
public function setCreatedAt($createdAt)
{
$this->created_at = $createdAt;
return $this;
}
/**
* Get created_at
*
* @return 'DateTime
*/
public function getCreatedAt()
{
return $this->created_at;
}
/**
* Set user
*
* @param User $user
* @return ObjectData
*/
public function setUser($user)
{
$this->user = $user;
return $this;
}
/**
* Get user
*
* @return User
*/
public function getUser()
{
return $this->user;
}
/**
* Set key
*
* @param string $key
* @return ObjectData
*/
public function setKey($key)
{
$this->key = $key;
return $this;
}
/**
* Get key
*
* @return string
*/
public function getKey()
{
return $this->key;
}
/**
* Set data
*
* @param string $data
* @return ObjectData
*/
public function setData($data)
{
$this->data = $data;
return $this;
}
/**
* Get data
*
* @return string
*/
public function getData()
{
return $this->data;
}
/**
* @ORM'PrePersist
*/
public function prepareForPersist()
{
$this->created_at = new 'DateTime();
}
}
和从ObjectData继承的附加对象:
use Doctrine'ORM'Mapping as ORM;
use MyProject'CoreBundle'Entity'ObjectData;
/**
* RequestData
*
* @ORM'Entity()
*/
class RequestData extends ObjectData
{
/**
* var Request $request
*
* @ORM'ManyToOne(targetEntity="Request", inversedBy="data")
* @ORM'JoinColumn(name="object_id", referencedColumnName="id")
*/
private $request;
/**
* Set request
*
* @param Request $request
* @return RequestData
*/
public function setRequest($request)
{
$this->request = $request;
return $this;
}
/**
* Get request
*
* @return Request
*/
public function getRequest()
{
return $this->request;
}
}
下面是使用RequestData实体的对象:
use Doctrine'Common'Collections'ArrayCollection;
use Doctrine'ORM'Mapping as ORM;
/**
* Request
*
* @ORM'Table(name="requests")
* @ORM'Entity(repositoryClass="RequestRepository")
* @ORM'HasLifecycleCallbacks()
*/
class Request
{
/**
* @var integer $id
*
* @ORM'Column(name="id", type="integer")
* @ORM'Id
* @ORM'GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var Message $message
*
* @ORM'ManyToOne(targetEntity="Message", inversedBy="requests")
*/
private $message;
/**
* @var RequestType $type
*
* @ORM'ManyToOne(targetEntity="RequestType")
* @ORM'JoinColumn(name="type_id", referencedColumnName="id")
*/
private $type;
/**
* @var ArrayCollection $data
*
* @ORM'OneToMany(
* targetEntity="RequestData",
* mappedBy="request",
* cascade={"persist","remove"}
* )
*/
private $data;
/**
* @var datetime $created_at
*
* @ORM'Column(name="created_at", type="datetime")
*/
private $created_at;
/**
* @var text $comment
*
* @ORM'Column(name="comment", type="text")
*/
private $comment;
/**
* @var ArrayCollection $responses
*
* @ORM'OneToMany(
* targetEntity="Response",
* mappedBy="request",
* cascade={"persist","remove"}
* )
*/
private $responses;
public function __construct()
{
$this->data = new ArrayCollection();
$this->responses = new ArrayCollection();
}
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set message
*
* @param Message $message
*/
public function setMessage($message)
{
$this->message = $message;
}
/**
* Get message
*
* @return Message
*/
public function getMessage()
{
return $this->message;
}
/**
* Set type
*
* @param RequestType $type
*/
public function setType($type)
{
$this->type = $type;
}
/**
* Get type
*
* @return RequestType
*/
public function getType()
{
return $this->type;
}
/**
* Set created_at
*
* @param datetime $createdAt
*/
public function setCreatedAt($createdAt)
{
$this->created_at = $createdAt;
}
/**
* Get created_at
*
* @return datetime
*/
public function getCreatedAt()
{
return $this->created_at;
}
/**
* Set comment
*
* @param text $comment
*/
public function setComment($comment)
{
$this->comment = $comment;
}
/**
* Get comment
*
* @return text
*/
public function getComment()
{
return $this->comment;
}
/**
* Add response
*
* @param Response $response
*/
public function addResponse($response)
{
foreach ( $this->responses as $r ) {
if ( $r->getUser() == $response->getUser() )
return;
}
$this->responses->add($response);
}
/**
* Get responses
*
* @return ArrayCollection
*/
public function getResponses()
{
return $this->responses;
}
public function hasResponse($user)
{
foreach ( $this->responses as $r ) {
if ( $r->getUser() == $user )
return $r;
}
return null;
}
public function addData($data)
{
$data->setRequest($this);
$this->data->add($data);
}
public function getData()
{
return $this->data;
}
/**
* @ORM'PrePersist
*/
public function prePersist()
{
$this->created_at = new 'DateTime();
}
}
最后是导致错误的代码:
use MyProject'MessageBundle'Entity'Request as MyRequest;
$data = new RequestData();
$data->setUser($user);
$data->setKey('user_id');
$data->setData(6);
$req = new MyRequest();
$req->setMessage($message);
$req->setComment('bla');
$req->setType($doctrine->getRepository('MessageBundle:RequestType')->find(1));
$req->addData($data);
$em->persist($req);
$em->flush();
有什么建议吗?
欢呼
我要做的就是让它工作
我必须更改ObjectData中的关联:
@ORM'OneToMany(targetEntity="User", mappedBy="data")
@ORM'ManyToOne(targetEntity="User", inversedBy="data")
相应地将数据字段添加到User实体。
/**
* @var ArrayCollection $data
*
* @ORM'OneToMany(targetEntity="ObjectData", mappedBy="user")
*/
private $data;
,瞧,成功了
尝试:
$req->addData(array($data));
解释:
arrayCollection构造函数类型提示数组作为其参数,因此您需要始终向其传递一个数组。