【问题标题】:Doctrine2 inverse persistance not working in nested formsDoctrine2 逆持久性不适用于嵌套形式
【发布时间】:2014-12-19 06:01:37
【问题描述】:

我正在创建一个MotorsAds 实体,并与MotorsAdsFile 实体链接到该实体。对于每个MotorsAds,我们可以附加许多MotorsAdsFile

我的目标是为 MotorsAds 创建一个表单,它允许通过单击按钮添加 MotorsAdsFile。在这里,我正在尝试实现embeded forms

我的问题是我得到了那个错误:

使用参数 ["5493b613839d7_2012-07-02 22.06.00.jpg", null] 执行 'INSERT INTO MotorsAdsFile (filename, motors_id) VALUES (?, ?)' 时发生异常:

SQLSTATE[23000]:违反完整性约束:1048 列“motors_id”不能为空

可能,MotorsAds 对象尚未持久化:这就是“motors_id”列为空的原因。你能帮忙解决这个问题吗?

我错过了什么吗?


1。实体的定义

MotorsAds 文件

<?php

namespace Minn\AdsBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\HttpFoundation\File\File;
use Symfony\Component\Validator\Constraints as Assert;
use Vich\UploaderBundle\Mapping\Annotation as Vich;

/**
 * @ORM\Entity
 * @Vich\Uploadable
 */
class MotorsAdsFile {

    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    public $id;

    /**
     * @Assert\File(
     *     maxSize="5M",
     *     mimeTypes={"image/png", "image/jpeg"}
     * )
     * @Vich\UploadableField(mapping="motors_files", fileNameProperty="filename")
     */
    protected $file;

    /**
     * @ORM\Column(type="string", length=255, name="filename")
     * @var string $filename
     */
    protected $filename;

    /**
     * @ORM\ManyToOne(targetEntity="Minn\AdsBundle\Entity\MotorsAds", inversedBy="files")
     * @ORM\JoinColumn(nullable=false,onDelete="CASCADE")
     */
    private $motors;

    /**
     * @param File|\Symfony\Component\HttpFoundation\File\UploadedFile $file
     */
    public function setFile(File $file) {
        $this->file = $file;
    }

    /**
     * @return File
     */
    public function getFile() {
        return $this->file;
    }

    /**
     * @param string $filename
     */
    public function setFilename($filename) {
        $this->filename = $filename;
    }

    /**
     * @return string
     */
    public function getFilename() {
        return $this->filename;
    }

    /**
     * Set motors
     *
     * @param \Minn\AdsBundle\Entity\MotorsAds $motors
     * @return MotorsAds
     */
    public function setMotors(\Minn\AdsBundle\Entity\MotorsAds $motors) {
        $this->motors = $motors;
        return $this;
    }

    /**
     * Get motors
     *
     * @return \Minn\AdsBundle\Entity\MotorsAds
     */
    public function getMotors() {
        return $this->motors;
    }
}

汽车广告

<?php

namespace Minn\AdsBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as Gedmo;
use Symfony\Component\Validator\Constraints as Assert;

/**
 * MotorsAds
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="Minn\AdsBundle\Entity\MotorsAdsRepository")
 * @ORM\HasLifecycleCallbacks()
 */
class MotorsAds {
    // ...
    /**
     * @ORM\OneToMany(targetEntity="Minn\AdsBundle\Entity\MotorsAdsFile",
     *                mappedBy="motors",  
     *                cascade={"persist", "remove"})
     * @ORM\JoinColumn(nullable=true)
     */
    private $files;
    public function __construct() {
        $this->files = new \Doctrine\Common\Collections\ArrayCollection();
        $this->favorites = new \Doctrine\Common\Collections\ArrayCollection();
    }

    public function getFiles() {
        return $this->files;
    }

    public function addFile(MotorsAdsFile $file) {
        $this->files[] = $file;
        return $this;
    }

    public function removeFile(MotorsAdsFile $file) {
        $this->files->removeElement($file);
    }
    // ...
}

2。表格

MotorsAdsFileType

class MotorsAdsFileType extends AbstractType {

    public function buildForm(FormBuilderInterface $builder, array $options) {
        $builder->add('file', 'file',array('required' => false));
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver) {
        $resolver->setDefaults(array(
            'data_class' => 'Minn\AdsBundle\Entity\MotorsAdsFile'
        ));
    }

    public function getName() {
        return 'MotorsAdsFiletype';
    }

}

MotorsAdsType

class MotorsAdsType extends AbstractType {

    public function buildForm(FormBuilderInterface $builder, array $options) {
        // ...some code here
        $builder->add('files','collection',array('type'=> new MotorsAdsFileType(),
                        'allow_add'=> true,
                        'allow_delete' => true,
                        'by_reference' => true));
    }
    public function setDefaultOptions(OptionsResolverInterface $resolver) {
        $resolver->setDefaults(array(
            'data_class' => 'Minn\AdsBundle\Entity\MotorsAds'
        ));
    }

    public function getName() {
        return 'MotorsAdstype';
    }
}

【问题讨论】:

  • 然后手动设置/持久化它..
  • 你能说得更准确点吗?

标签: forms symfony doctrine-orm nested-forms


【解决方案1】:

我找到了解决办法...

有两件事要做:

(1)

public function buildForm(FormBuilderInterface $builder, array $options) {
    // ...some code here
    $builder->add('files','collection',array('type'=> new MotorsAdsFileType(),
                    'allow_add'=> true,
                    'allow_delete' => true,
                    'by_reference' => false)); // it has to be set to false and not true
}

(2)

public function addFile(MotorsAdsFile $file) {
    $file->setMotors($this);      // you have to add this line too
    $this->files[] = $file;
    return $this;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多