原则2,当关系存在时无法插入数据库 [英] doctrine 2, unable to insert to database when relation is present

查看:96
本文介绍了原则2,当关系存在时无法插入数据库的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有两个意见:

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆