2016-02-21 120 views
2

我有两个实体页面和文件。一页有许多文件。我的其他实体也有很多文件,所以我通过两列(entity_id和entity_type)加入页面和文件。当我有样品数据并且得到它时,一切正常。当我试图将页面和文件添加到数据库时,我发现问题,文件从页面获取ID但是不会获取entity_type。学说2 @joincolumns

创建实体:

$page = new \CmsIr\Page\Entity\Page(); 
$page->exchangeArray($form->getData()); 
$page->setEntityType('page'); 

$this->getEm()->persist($page); 
$this->getEm()->flush(); 

foreach($scannedDirectory as $file) { 
    $mimeType = $this->getFileService()->getMimeContentType($this->uploadDir . '/' . $file); 

    $pageFile = new \CmsIr\File\Entity\File(); 
    $pageFile->setFilename($file); 
    $pageFile->setPage($page); 
    $pageFile->setMimeType($mimeType); 

    $this->getEm()->persist($pageFile); 
    $this->getEm()->flush();      
} 

错误的样子:

An exception occurred while executing 'INSERT INTO cms_file (entity_type, entity_id, filename, mime_type) VALUES (?, ?, ?, ?)' with params [null, 5, "140343_las-promienie-slonca-56c9a66d27830.jpg", "image\/jpeg; charset=binary"]: 

SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'entity_type' cannot be null 

页:

/** 
* @ORM\Entity 
* @ORM\Table(name="cms_page") 
*/ 
class Page 
{ 
/** 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="AUTO") 
* @ORM\Column(type="integer") 
*/ 
protected $id; 

/** @ORM\Column(type="string") */ 
protected $name; 

/** @ORM\Column(type="string") */ 
protected $subtitle; 

/** @ORM\Column(type="string") */ 
protected $url; 

/** @ORM\Column(type="string") */ 
protected $entity_type; 

/** 
* @ORM\OneToOne(targetEntity="CmsIr\System\Entity\Status") 
* @ORM\JoinColumn(name="status_id", referencedColumnName="id") 
*/ 
protected $status; 

/** @ORM\Column(type="text") */ 
protected $content; 

/** @ORM\Column(type="string") */ 
protected $filename; 

/** 
* @ORM\OneToMany(targetEntity="CmsIr\File\Entity\File", mappedBy="page") 
*/ 
protected $files; 

public function __construct() 
{ 
    $this->files = new \Doctrine\Common\Collections\ArrayCollection(); 
} 

文件:

/** 
* @ORM\Entity 
* @ORM\Table(name="cms_file") 
*/ 
class File 
{ 
/** 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="AUTO") 
* @ORM\Column(type="integer") 
*/ 
protected $id; 

/** @ORM\Column(type="string") */ 
protected $entity_type; 

/** @ORM\Column(type="integer") */ 
protected $entity_id; 

/** @ORM\Column(type="text") */ 
protected $filename; 

/** @ORM\Column(type="string") */ 
protected $mime_type; 

/** 
* @ORM\ManyToOne(targetEntity="CmsIr\Page\Entity\Page") 
* @ORM\JoinColumns({ 
* @ORM\JoinColumn(name="entity_id", referencedColumnName="id"), 
* @ORM\JoinColumn(name="entity_type", referencedColumnName="entity_type"), 
* }) 
**/ 
protected $page; 
+0

它看起来像你想插入带''entity_type'一个null'文件到您的桌面。 –

回答

1

从我可以从你的Page实体定义见,entity_type被定义为integer

/** @ORM\Column(type="integer") */ protected $entity_type;

在你的代码片段在这里:

$page->setEntityType('page');

你传递一个字符串值。

我对此的解决方案将获得entity_type的参考,您正尝试将它设置为在调用setter方法之前。

实质上,您的setter方法应该接受entity_type实体的实例,一个对象而不是字符串。

希望这至少能指引您朝着正确的方向发展。

0

我认为你只是在你的代码中有点乱。在顶部设置:

$page->setEntityType('page'); 

entity_type作为整数后面定义:

/** @ORM\Column(type="integer") */ 
protected $entity_type; 

然后你想从一个File参考Page在那里你在注释@ORM\JoinColumns(...)设置。

你不需要做任何。使用One-to-Many的简单格式,它会自动为您创建page_id列。

你的情况:

class File { 
    /** 
    * @ManyToOne(targetEntity="Page", inversedBy="files") 
    * @JoinColumn(name="product_id", referencedColumnName="id") 
    */ 
    private $page; 

    /* ... */ 
} 
+0

我的不好,我尝试了很多整数和字符串的选项。 'entity_type'被定义为字符串。 我需要这样做,因为许多entite使用'File'加入: 'Page','Post','Slider' – wtk13