原则2,当关系存在时无法插入数据库 [英] doctrine 2, unable to insert to database when relation is present
问题描述
我有两个意见:
1)服务
/**
* @Id @Column(name="id", type="integer")
* @GeneratedValue
*/
private $id;
/** @Column(length=255) */
private $name;
/** @Column(length=255) */
private $description;
/** @Column(type="integer") */
private $parent;
/**
* @OneToMany(targetEntity="Lead", mappedBy="service",cascade={"persist"})
**/
protected $leads;
2)Lead
/**
* @Id @Column(name="id", type="integer")
* @GeneratedValue
*/
private $id;
/** @Column(type="integer") */
private $user_id;
/** @Column(name="service_id", type="integer") */
private $service_id;
/** @Column(type="integer") */
private $lead_sent;
/** @Column(type="datetime") */
private $date_created;
/** @Column(type="datetime", nullable=true) */
private $date_sent = null;
/** @Column(type="integer", nullable=true) */
private $size;
/** @Column(type="text", nullable=true) */
private $comment;
/** @Column(type="datetime") */
private $estimate_date;
/** @Column(type="integer") */
private $source_zip;
/** @Column(type="integer", nullable=true) */
private $destination_zip;
/** @Column(type="integer", nullable=true) */
private $parent_lead;
/**
* @ManyToOne(targetEntity="Service", inversedBy="leads")
* * @JoinColumn(name="service_id", referencedColumnName="id")
**/
protected $service;
选择时:
$query = $em->createQuery("SELECT l FROM Entities\Lead l
LEFT JOIN l.service s
WHERE l.user_id='".$user_id."' ");
$leads = $query->getResult();
return $leads;
当我做选择时,一切都很好,但是当插入时我收到错误:
everything is great when I am doing select but when doing insert I am getting error:
Message: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'service_id' cannot be null
我想这将是更新的情况。
I guess this would be case also for update.
这个错误是可以的,因为service_id不能为空。
This error is ok, because service_id can not be null.
这是我的插入代码:
$service = $this->em->getRepository("Entities\Service")->findBy(array("id"=>$data['master-service-id']));
$lead = new Entities\Lead;
$lead->setUser_id($this->user->getId());
$lead->setLead_sent(0);
$lead->setDate_created(new DateTime(date('Y-m-d H:i:s')));
$lead->setDate_sent(new DateTime(date('0000-00-00 00:00:00')));
$lead->setService_id($service[0]->getId());
if($data['commnet']){
$lead->setComment($data['commnet']);
}
$lead->setSource_zip($data['zip']);
if($data['target_zip']){
$lead->setDestination_zip($data['target_zip']);
}
$lead->setEstimate_date(new DateTime($data['date']));
$this->em->persist($lead);
$this->em->flush();
请帮助。
推荐答案
问题从这里开始:
/** @Column(name="service_id", type="integer") */
private $service_id;
/**
* @ManyToOne(targetEntity="Service", inversedBy="leads")
* @JoinColumn(name="service_id", referencedColumnName="id")
*/
protected $service;
永不将单个数据库列映射为 > @Column
和 @ManyToOne
(或 @OneToOne
)! Doctrine2在执行此操作时会表现不稳定,因此您必须在常规列或关联之间进行选择。
Never map a single db column as both @Column
and @ManyToOne
(or @OneToOne
)! Doctrine2 will behave erratic when you do this, so you must choose between a regular column, or an association.
在这种特殊情况下,我建议您选择一个关联,所以删除@Column。只使用这部分:
In this particular case I'd advise you to choose an association, so remove the @Column. Only use this part:
/**
* @ManyToOne(targetEntity="Service", inversedBy="leads")
* @JoinColumn(name="service_id", referencedColumnName="id")
*/
protected $service;
然后你可以这样做:
$service = $em->getRepository('Service')->find(1);
$lead = new Lead();
$lead->setService($service);
$em->persist($lead);
$em->flush();
Doctrine2将确保Service表的主键将用作外键(service_id)牵头桌。
Doctrine2 will make sure the primary key of the Service table will be used as foreign key (service_id) in the Lead table.
这篇关于原则2,当关系存在时无法插入数据库的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!