2016-02-21 2 views
2

У меня есть две сущности Страница и файл. На одной странице много Файлов. У других моих объектов также есть много файлов, поэтому я присоединяюсь к странице и файлу двумя столбцами (entity_id и entity_type). Когда у меня есть образцы данных, и я понимаю, все работает нормально. Я обнаружил проблему при попытке добавить страницу и файлы в db, файлы получают идентификатор из страницы, но dont'get entity_type.Doctrine 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' определяется как строка. Мне нужно сделать это так, потому что многие из них присоединяются к 'File': ' Страница', 'Post',' Slider' – wtk13

Смежные вопросы