2013-04-19 2 views
3

Я пытаюсь вставить новый объект/строку в базу данных. Объект создается следующим образом:Doctrine2 - Столбцы меняются на нуль перед очисткой

$nodeaccess = new Nodeaccess(); // A by doctrine2 generated entity 
$nodeaccess->setAccesslevel(0); 
$nodeaccess->setDraw(0); 
$nodeaccess->setUserid($userid); 
$nodeaccess->setNodename($this->getUser()->getUsername() . ' Node'); 
$nodeaccess->setMac($node); 

Все столбцы таблицы установлены. Когда я печатаю $nodeaccess->getUserid() и $nodeaccess->getMac(), желаемые результаты печатаются. И они оба не пустые.

Но когда объект сохраняется так:

$em = $this->getDoctrine()->getManager(); 
$em->persist($nodeaccess); 
$em->flush(); 

следующая ошибка происходит:

Исключение при выполнении «INSERT INTO nodeaccess (макинтош, идентификатор пользователя, AccessLevel, NODENAME, draw) VALUES (?,?,?,?,?) 'с params {"1": null, "2": null, "3": 0, "4": "Пример узла", "5": 0}:

SQLSTATE [23000]: ограничение целостности Нарушение т: 1048 Колонка «МКВ» не может быть нулевой

макинтош и идентификатор пользователя в сочетании является первичным ключом, и они оба являются внешними ключами, а также. Они настроены в модели, как это:

/** 
* @var integer 
* 
* @ORM\Column(name="mac", type="bigint", nullable=false) 
* @ORM\Id 
*/ 
private $mac; 

/** 
* @var integer 
* 
* @ORM\Column(name="userID", type="integer", nullable=false) 
* @ORM\Id 
**/ 
private $userid; 

Общественные аксессоров реализуются, и я попытался изменить поля для общественности, но это не помогло.

Update Аксессоры:

public function getMac() 
{ 
    return $this->mac; 
} 

public function setMac($mac) 
{ 
    $this->mac = $mac; 
} 

public function getUserid() 
{ 
    return $this->userid; 
} 

public function setUserid($userid) 
{ 
    $this->userid = $userid; 
} 

Update 2 Я изменил таблицу, теперь только mac поле NULL. Новая модель:

/** 
* @var integer 
* 
* @ORM\Column(name="id", type="integer", nullable=false) 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="IDENTITY") 
*/ 
private $id; 

/** 
* @var integer 
* 
* @ORM\Column(name="mac", type="bigint", nullable=false) 
*/ 
private $mac; 

/** 
* @var integer 
* 
* @ORM\Column(name="userID", type="integer", nullable=false) 
**/ 
private $userid; 

UPDATE Действие контроллера:

public function inviteAction() { 
    $repository = $this->getDoctrine() 
      ->getRepository('GeninnoEDSBundle:Nodeaccess'); 
    $options = $repository->createQueryBuilder('na') 
      ....... 
      ->getQuery() 
      ->getResult(); 

    $form = $this->createFormBuilder() 
      ->add('user', 'text', array(
       'attr' => array(
        'placeholder' => '+ Gebruiker' 
       ) 
      )) 
      ->add('node', 'hidden') 
      ->getForm(); 

    if ($this->getRequest()->isMethod('POST')) { 
     $form->bind($this->getRequest()); 

     if ($form->isValid()) { 
      $data = $form->getData(); 

      $user_repository = $this->getDoctrine() 
        ->getRepository('GeninnoEDSBundle:User'); 
      $user = $user_repository->findOneBy(array('username' => $data['user'])); 

      $node_repository = $this->getDoctrine() 
        ->getRepository('GeninnoEDSBundle:Node'); 
      $node = $node_repository->find($data['node']); 

      $nodeaccess = new Nodeaccess(); 
      $nodeaccess->setAccesslevel(0); 
      $nodeaccess->setDraw(0); 
      $nodeaccess->setUserid($user); 
      $nodeaccess->setNodename($this->getUser()->getUsername() . ' Node'); 
      $nodeaccess->setMac($node); 

      $em = $this->getDoctrine()->getManager(); 
      $em->persist($nodeaccess); 
      $em->flush(); 
     } 
    } 

    return array('options' => $options, 'form' => $form->createView()); 
} 
+0

Постарайтесь сделать атрибуты защищенными или общедоступными и реализовать аксессоры. – Sammy

+0

Аксессуи реализованы и изменение полей для общественности не помогло. Я обновлю вопрос – Raymen

+0

@RaymenScholten, если вы 'var_dump' объект перед его сохранением, имеют ли свойства указанные значения? – gilden

ответ

1

Проблема была решена путем регенерации этого конкретного лица (о-о). Поля изменились на:

/** 
* @var \User 
* 
* @ORM\ManyToOne(targetEntity="User") 
* @ORM\JoinColumns({ 
* @ORM\JoinColumn(name="userID", referencedColumnName="id") 
* }) 
*/ 
private $userid; 

/** 
* @var \Node 
* 
* @ORM\ManyToOne(targetEntity="Node") 
* @ORM\JoinColumns({ 
* @ORM\JoinColumn(name="mac", referencedColumnName="mac") 
* }) 
*/ 
private $mac; 

UPDATE

Это не могло бы быть исправление я думал, что это было. Если проблема снова возникла, добавив некоторые поля в класс. Я узнал, что, удалив следующий код, пользователь больше не был привязан к нулевому значению, сохраняя его.

/** 
* @var \Doctrine\Common\Collections\Collection 
* 
* @ORM\ManyToOne(targetEntity="User", inversedBy="accessNodes") 
* @ORM\JoinColumn(name="userID", referencedColumnName="id") 
**/ 
private $accessUsers; 
+0

По-прежнему думаю, что вы на трансформаторах, за мой ответ. – Lighthart

+0

Вы узнали, почему эта ошибка возникла? –

+0

@ RafaelBasso Извините, я больше не помню, почему и не имею доступа к репозиторию больше – Raymen

0

Короткий ответ: Ваш скрытом поле формы для узла использует значение __toString(), который не является идентификатором и, следовательно, не может быть найден вашим вызовом репозитория и, следовательно, имеет значение null в постоянное время.

Длинный ответ: Используйте трансформатор:

в контроллере:

use GeninnoEDSBundle\Transformer\NodeTransformer; 

и изменить форму строитель:

$transformer = new NodeTransformer($em); 
$form = $this->createFormBuilder() 
     ->add('user', 'text', array(
      'attr' => array(
       'placeholder' => '+ Gebruiker' 
      ) 
     )) 
     ->add($builder->create('node', 'hidden') 
      ->addModelTransformer($transformer) 
     ) 
     ->getForm(); 

Ваш трансформатор (новый файл: GeninnoEDSBundle \ Transformer \ NodeTransformer .php):

<?php 

namespace GeninnoEDSBundle\Transformer; 

use Doctrine\Common\Persistence\ObjectManager; 
use GeninnoEDSBundle\Entity\Node; 
use Symfony\Component\Form\DataTransformerInterface; 
use Symfony\Component\Form\Exception\TransformationFailedException; 

class NodeTransformer implements DataTransformerInterface 
{ 
    /** 
    * @var ObjectManager 
    */ 
    private $em; 

    // If selector is multiple (Many2One or Many2Many) 

    private $multi; 

    /** 
    * @param ObjectManager $em 
    */ 
    public function __construct(ObjectManager $em, $multi=false) 
    { 
     $this->em = $em; 
     $this->multi=$multi; 
    } 

    /** 
    * Transforms an object (node) to a string (id). 
    * 
    * @param Issue|null $node 
    * @return string 
    */ 
    public function transform($node) 
    { 
     if (null === $node) {return "";} 
     if (is_object($node) && method_exists($node, "toArray")){ 
      $node=$node->map(function ($ob){return $ob->getId();}); 
      return implode(",",$node->toArray()); 
     } 

     if ('array' == gettype($node)) { 
      return implode(',' 
          , array_map(function($element){ 
              return $element->getId(); 
             } 
             ,$node)); 
     } 
// var_dump($node); 
     return $node->getId(); 
    } 

    /** 
    * Transforms a string (id) to an object (node). 
    * 
    * @param string $id 
    * @return Issue|null 
    * @throws TransformationFailedException if object (node) is not found. 
    */ 
    public function reverseTransform($id) 
    { 

     if (!$id) { 
      if($this->multi) {return array();} 
      return null; 
     } 

     if (strpos($id,',') !== false) { 
      $id=explode(',',$id); 
     } 

     $qb=$this->em 
     ->getRepository('GeninnoEDSBundle:Node') 
     ->createQueryBuilder('r'); 
     $qb->andWhere($qb->expr()->in('r.id', $id)); 
     if (is_array($id) || $this->multi){ 
      $node=$qb->getQuery() 
      ->getResult(); 
     } else { 
      $node=$qb->getQuery() 
      ->getSingleResult(); 
     } 

     if (null === $node) { 
      throw new TransformationFailedException(sprintf(
       'An node with id "%s" does not exist!', 
       $id 
       )); 
     } 

     return $node; 
    } 
} 

Обратите внимание: я добавил свой трансформатор, но вам, возможно, придется возиться с логикой для вашего приложения.

Больше на трансформаторах: http://symfony.com/doc/current/cookbook/form/data_transformers.html

+0

Я получил правильные объекты, используя входные данные из формы – Raymen

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