symfony2: хранение объекта в базе данных - PullRequest
0 голосов
/ 12 марта 2012

Когда я пытаюсь выполнить действие ниже, я получаю эту ошибку:

SQLSTATE [23000]: нарушение ограничения целостности: 1048 Столбец 'category_id' не может быть пустым (500 Внутренняя ошибка сервера)

Как вы можете видеть в действии, я устанавливаю поле category_id (setCategoryId ()), в чем причина ошибки?

Примечание: как вы видите, я пытаюсь сохранить в базе данных предложение (propuesta) и связанные с ним теги.

public function savePropuestaAction() {

    $em = $this->get('doctrine.orm.entity_manager');
    $propuesta = new Propuestas();

    //retrieve the values inserted in the form.    
    $form = $this->getRequest()->request->get('form');
    $propuestaContent = $form['propuesta'];
    $propuestaCategory = $form['Categoría'][0];     

    $propuesta->setTitulo('$propuestaCategory');
    $propuesta->setContenido($propuestaContent);
    $propuesta->setCategoryId(1);

    //retrieve the tags inserted in the form...
    $tags = array();
    foreach($form as $key => $field)
    {
      if(substr($key, 0, 3) == 'tag')
      {
        $tagsName[] = $field;
      }
    }

    // ...and then store them and associate them to the proposal.
    if(count($tagsName))
    {                  
      foreach($tagsName as $tagName)
      { 
        $tag = new TagPropuesta();
        $tag->setName($tagName);
        $em->persist($tag);
        $em->flush();

        $propuesta->addTagPropuesta($tag);
        $em->persist($propuesta);
        $em->flush();
      }
    }              

    return new Response();
}

РЕДАКТИРОВАТЬ: после нескольких ответов я попробовал заменить строку

$propuesta->setCategoryId(1);

с

$repository = $this->getDoctrine()->getRepository('JanderJanderBundle:PropuestasCategory');
$category = $repository->find(1);
//die(get_class($category)); 
$propuesta->setCategory($category);

но сообщение об ошибке совпадает ..

Здесь у вас также есть файл .yml и сущность Propuesta (я вообще не изменял класс Propuesta, я просто сгенерировал его с помощью задачи generate: entity):

Jander\JanderBundle\Entity\Propuestas:
  type: entity
  table: propuestas
  fields:
    id:
      id: true
      type: integer
      unsigned: false
      nullable: false
      generator:
        strategy: IDENTITY
    category_id:
      type: integer
      nullable: true
    user_id:
      type: integer
      nullable: true
    titulo:
      type: string
      length: 230
      fixed: false
    contenido:
      type: string
      length: 230
      fixed: false
    tema:
      type: string
      length: 40
      fixed: false
      nullable: true
    eliminado:
      type: boolean
      nullable: true
    created:
      type: date
      gedmo:
        timestampable:
          on: create
    votes_up:
      type: integer
      nullable: true
    votes_down:
      type: integer
      nullable: true
  manyToOne:
    category:
      targetEntity: PropuestasCategory
      inversedBy: propuestas
      joinColumn:
        name: category_id
        referencedColumnName: id  
    usuario:
      targetEntity: Usuario
      inversedBy: propuestas
      joinColumn:
        name: user_id
        referencedColumnName: id
  manyToMany:
    tags:
      targetEntity: TagPropuesta
      inversedBy: propuestas    
  lifecycleCallbacks: {  }



<?php

namespace Jander\JanderBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Jander\JanderBundle\Entity\Propuestas
 */
class Propuestas
{
    /**
     * @var integer $id
     */
    private $id;

    /**
     * @var string $contenido
     */
    private $contenido;

    /**
     * @var string $tema
     */
    private $tema;

    /**
     * @var boolean $eliminado
     */
    private $eliminado;

    /**
     * @var date $created
     */
    private $created;

    /**
     * @var integer $votes
     */
    private $votes;


    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set contenido
     *
     * @param string $contenido
     */
    public function setContenido($contenido)
    {
        $this->contenido = $contenido;
    }

    /**
     * Get contenido
     *
     * @return string 
     */
    public function getContenido()
    {
        return $this->contenido;
    }

    /**
     * Set tema
     *
     * @param string $tema
     */
    public function setTema($tema)
    {
        $this->tema = $tema;
    }

    /**
     * Get tema
     *
     * @return string 
     */
    public function getTema()
    {
        return $this->tema;
    }

    /**
     * Set eliminado
     *
     * @param boolean $eliminado
     */
    public function setEliminado($eliminado)
    {
        $this->eliminado = $eliminado;
    }

    /**
     * Get eliminado
     *
     * @return boolean 
     */
    public function getEliminado()
    {
        return $this->eliminado;
    }

    /**
     * Set created
     *
     * @param date $created
     */
    public function setCreated($created)
    {
        $this->created = $created;
    }

    /**
     * Get created
     *
     * @return date 
     */
    public function getCreated()
    {
        return $this->created;
    }

    /**
     * Set votes
     *
     * @param integer $votes
     */
    public function setVotes($votes)
    {
        $this->votes = $votes;
    }

    /**
     * Get votes
     *
     * @return integer 
     */
    public function getVotes()
    {
        return $this->votes;
    }
    /**
     * @var integer $category_id
     */
    private $category_id;

    /**
     * @var Jander\JanderBundle\Entity\PropuestasCategory
     */
    private $category;


    /**
     * Set category_id
     *
     * @param integer $categoryId
     */
    public function setCategoryId($categoryId)
    {
        $this->category_id = $categoryId;
    }

    /**
     * Get category_id
     *
     * @return integer 
     */
    public function getCategoryId()
    {
        return $this->category_id;
    }

    /**
     * Set category
     *
     * @param Jander\JanderBundle\Entity\PropuestasCategory $category
     */
    public function setCategory(\Jander\JanderBundle\Entity\PropuestasCategory $category)
    {
        $this->category = $category;
    }

    /**
     * Get category
     *
     * @return Jander\JanderBundle\Entity\PropuestasCategory 
     */
    public function getCategory()
    {
        return $this->category;
    }
    /**
     * @var Jander\JanderBundle\Entity\TagPropuesta
     */
    private $tags;

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

    /**
     * Add tags
     *
     * @param Jander\JanderBundle\Entity\TagPropuesta $tags
     */
    public function addTagPropuesta(\Jander\JanderBundle\Entity\TagPropuesta $tags)
    {
        $this->tags[] = $tags;
    }

    /**
     * Get tags
     *
     * @return Doctrine\Common\Collections\Collection 
     */
    public function getTags()
    {
        return $this->tags;
    }
    /**
     * @var integer $user_id
     */
    private $user_id;

    /**
     * @var Jander\JanderBundle\Entity\Usuario
     */
    private $usuario;


    /**
     * Set user_id
     *
     * @param integer $userId
     */
    public function setUserId($userId)
    {
        $this->user_id = $userId;
    }

    /**
     * Get user_id
     *
     * @return integer 
     */
    public function getUserId()
    {
        return $this->user_id;
    }

    /**
     * Set usuario
     *
     * @param Jander\JanderBundle\Entity\Usuario $usuario
     */
    public function setUsuario(\Jander\JanderBundle\Entity\Usuario $usuario)
    {
        $this->usuario = $usuario;
    }

    /**
     * Get usuario
     *
     * @return Jander\JanderBundle\Entity\Usuario 
     */
    public function getUsuario()
    {
        if($this->usuario == null)
        {
            return "anonimo";  
        }else{
            return $this->usuario;
        }

    }
    /**
     * @var integer $jander
     */
    private $jander;


    /**
     * Set jander
     *
     * @param integer $jander
     */
    public function setJander($jander)
    {
        $this->jander = $jander;
    }

    /**
     * Get jander
     *
     * @return integer 
     */
    public function getJander()
    {
        return $this->jander;
    }
    /**
     * @var integer $votes_up
     */
    private $votes_up;

    /**
     * @var integer $votes_down
     */
    private $votes_down;


    /**
     * Set votes_up
     *
     * @param integer $votesUp
     */
    public function setVotesUp($votesUp)
    {
        $this->votes_up = $votesUp;
    }

    /**
     * Get votes_up
     *
     * @return integer 
     */
    public function getVotesUp()
    {
        if($this->votes_up == null)
        {
          return 0;
        }
        else
        {
          return $this->votes_up;
        }    
    }

    /**
     * Set votes_down
     *
     * @param integer $votesDown
     */
    public function setVotesDown($votesDown)
    {
        $this->votes_down = $votesDown;
    }

    /**
     * Get votes_down
     *
     * @return integer 
     */
    public function getVotesDown()
    {
        if($this->votes_down == null)
        {
          return 0;
        }
        else
        {
          return $this->votes_down;
        }    


    }

    public function getTotalVotes()
    {
        return ($this->getVotesDown()+$this->getVotesUp());
    }
    /**
     * @var string $titulo
     */
    private $titulo;


    /**
     * Set titulo
     *
     * @param string $titulo
     */
    public function setTitulo($titulo)
    {
        $this->titulo = $titulo;
    }

    /**
     * Get titulo
     *
     * @return string 
     */
    public function getTitulo()
    {
        return $this->titulo;
    }
}

1025 * Javi *

Ответы [ 2 ]

2 голосов
/ 12 марта 2012

Я думаю, что в вашей таблице БД с именем 'propuesta' есть иностранный ключ category_id, верно?Тогда в вашей сущности должно быть поле category, а не category_id, а его функции set и get - setCategory () и getCategory (), а не setCategoryId ().Для поля, связанного с посторонним ключом, должен был ожидаться его объект.Итак, в вашем случае

$category=$em->getDoctrine()->getEnitityManager()->getRepository('YourBundleName:Category')->find($id);
$propuesta->setCategory($category);//here category is an object.

, поэтому сначала проверьте вашу сущность propuesta и ее файл yml.

updated

1. Change your yml like this

    Jander\JanderBundle\Entity\Propuestas:
      type: entity
      table: propuestas
      fields:
        id:
          id: true
          type: integer
          unsigned: false
          nullable: false
          generator:
            strategy: IDENTITY
        user_id:
          type: integer
          nullable: true
        titulo:
          type: string
          length: 230
          fixed: false
        contenido:
          type: string
          length: 230
          fixed: false
        tema:
          type: string
          length: 40
          fixed: false
          nullable: true
        eliminado:
          type: boolean
          nullable: true
        created:
          type: date
          gedmo:
            timestampable:
              on: create
        votes_up:
          type: integer
          nullable: true
        votes_down:
          type: integer
          nullable: true
      manyToOne:
        category:
          targetEntity: PropuestasCategory
          inversedBy: propuestas
          joinColumn:
            name: category_id
            referencedColumnName: id  
        usuario:
          targetEntity: Usuario
          inversedBy: propuestas
          joinColumn:
            name: user_id
            referencedColumnName: id
      manyToMany:
        tags:
          targetEntity: TagPropuesta
          inversedBy: propuestas    
      lifecycleCallbacks: {  }

Вы делаете 'Не нужно указывать category_id в вашем файле yml, просто укажите отношение.

  1. Измените свой файл сущности также

    удалите поле categoryid его setCategoryId () и getCategoryId () функция.

  2. Вы должны изменить все свои yml-файлы другой таблицы и задать отношение, как указано выше. Также измените их файлы сущностей.

Просто пройдите, как написать yml-файл и его отношение, затем используйте команду generate: enitites для symfony2.

Если вы не знаете, как написать yml и его сущность, еще один хороший метод - обратный процесс 1.Сначала создайте свою базу данных и ее таблицы, задайте для нее внешние связи, как вам нужно в вашем msql.

  1. установите соединения с базой данных в файле settings.ini вашего проекта (надеюсь, вы знаете, простоукажите имя, имя пользователя, пароль (если есть)).

  2. Удалите все свои yml-файлы в файлах res / config / doctrine / и Entity.

4.откройте ваш терминал, просто дайте следующие команды.Эти команды ниже автоматически генерируют все ваши файлы сущностей и yml-файлы с правильными отношениями, указанными в вашей базе данных.

a) .php app / console doctrine: mapping: convert yml ./src/Acme/BlogBundle/Resources/ config / doctrine --from-database --force // Acme / BlogBundle / пространство имен

Symfony2 создает сущность из базы данных
b) .php app / console doctrine: mapping: import AcmeBlogBundle yml //AcmeBlogBundle - это имя пакета c) .php app / console доктрина: генерировать: лица AcmeBlogBundle

если у вас есть какие-либо сомнения, обратитесь по этой ссылке Нажмите здесь

Надеюсь, это поможет вам

0 голосов
/ 12 марта 2012

Нужно думать объекты, а не идентификаторы ';

$category = $em=>getReference('Category',1);
$propuesta->setCategory($category);

Я предполагаю, что вы определили отношение между пропуестой и категорией.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...