我的Checkbox多项选择不会插入数据库symfony2 doctrine

时间:2016-08-20 13:17:47

标签: php mysql symfony doctrine-orm

我有2个表,Subproduto和Subpedido,subpedido有很多subproduto。首先,我尝试使属性$subprodutos类型json_array,但实体类型返回{}数组为空。然后我仍然尝试关系,但没有成功。

Subproduto.php

<?php

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Subproduto
 *
 * @ORM\Table(name="subproduto")
 * @ORM\Entity(repositoryClass="AppBundle\Repository\SubprodutoRepository")
 */
class Subproduto
{
/**
 * @var int
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * @var string
 *
 * @ORM\Column(name="descricao", type="string", length=50)
 */
private $descricao;

/**
 * @var string
 *
 * @ORM\Column(name="valor", type="decimal", scale=2)
 */
private $valor;

/**
 * @var int
 *
 * @ORM\Column(name="multiplo", type="smallint")
 */
private $multiplo=1;

/**
 * @var int
 *
 * @ORM\Column(name="ativo", type="smallint")
 */
private $ativo=1;

/**
 * @ORM\ManyToOne(targetEntity="Subcategoria", inversedBy="subprodutos")
 * @ORM\JoinColumn(name="subcategoria_id", referencedColumnName="id")
 */
protected $subcategoria;

/**
 * @ORM\ManyToOne(targetEntity="Estoque", inversedBy="subprodutos")
 * @ORM\JoinColumn(name="estoque_id", referencedColumnName="id")
 */
protected $estoque;

/**
 * @ORM\OneToMany(targetEntity="Subpedido", mappedBy="subproduto")
 */
private $subpedidos;

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

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

/**
 * Set descricao
 *
 * @param string $descricao
 *
 * @return Subproduto
 */
public function setDescricao($descricao)
{
    $this->descricao = $descricao;

    return $this;
}

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

/**
 * Set valor
 *
 * @param string $valor
 *
 * @return Subproduto
 */
public function setValor($valor)
{
    $this->valor = $valor;

    return $this;
}

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

/**
 * Set multiplo
 *
 * @param integer $multiplo
 *
 * @return Subproduto
 */
public function setMultiplo($multiplo)
{
    $this->multiplo = $multiplo;

    return $this;
}

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

/**
 * Set ativo
 *
 * @param integer $ativo
 *
 * @return Subproduto
 */
public function setAtivo($ativo)
{
    $this->ativo = $ativo;

    return $this;
}

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

/**
 * Set subcategoria
 *
 * @param \AppBundle\Entity\Subcategoria $subcategoria
 *
 * @return Subproduto
 */
public function setSubcategoria(\AppBundle\Entity\Subcategoria $subcategoria = null)
{
    $this->subcategoria = $subcategoria;

    return $this;
}

/**
 * Get subcategoria
 *
 * @return \AppBundle\Entity\Subcategoria
 */
public function getSubcategoria()
{
    return $this->subcategoria;
}

/**
 * Set estoque
 *
 * @param \AppBundle\Entity\Estoque $estoque
 *
 * @return Subproduto
 */
public function setEstoque(\AppBundle\Entity\Estoque $estoque = null)
{
    $this->estoque = $estoque;

    return $this;
}

/**
 * Get estoque
 *
 * @return \AppBundle\Entity\Estoque
 */
public function getEstoque()
{
    return $this->estoque;
}
/**
 * Constructor
 */
public function __construct()
{
    $this->subpedido = new \Doctrine\Common\Collections\ArrayCollection();
}

/**
 * Add subpedido
 *
 * @param \AppBundle\Entity\Subpedido $subpedido
 *
 * @return Subproduto
 */
public function addSubpedido(\AppBundle\Entity\Subpedido $subpedido)
{
    $this->subpedido[] = $subpedido;

    return $this;
}

/**
 * Remove subpedido
 *
 * @param \AppBundle\Entity\Subpedido $subpedido
 */
public function removeSubpedido(\AppBundle\Entity\Subpedido $subpedido)
{
    $this->subpedido->removeElement($subpedido);
}

/**
 * Get subpedido
 *
 * @return \Doctrine\Common\Collections\Collection
 */
public function getSubpedido()
{
    return $this->subpedido;
}

/**
 * Get subpedidos
 *
 * @return \Doctrine\Common\Collections\Collection
 */
public function getSubpedidos()
{
    return $this->subpedidos;
}
}

Subpedido.php

<?php

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Subpedido
 *
 * @ORM\Table(name="subpedido")
 *    @ORM\Entity(repositoryClass="AppBundle\Repository\SubpedidoRepository")
 */
class Subpedido
{
/**
 * @var int
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * @var int
 *
 * @ORM\Column(name="quantidade", type="smallint")
 */
private $quantidade;

/**
 * @ORM\ManyToOne(targetEntity="Subproduto", inversedBy="subpedidos", cascade={"persist"})
 * @ORM\JoinColumn(name="subproduto_id", referencedColumnName="id")
 */
protected $subproduto;

/**
 * @ORM\ManyToOne(targetEntity="Pedido", inversedBy="subpedidos")
 * @ORM\JoinColumn(name="pedido_id", referencedColumnName="id")
 */
protected $pedido;

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

/**
 * Set quantidade
 *
 * @param integer $quantidade
 *
 * @return Subpedido
 */
public function setQuantidade($quantidade)
{
    $this->quantidade = $quantidade;

    return $this;
}

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

/**
 * Set subproduto
 *
 * @param \AppBundle\Entity\Subproduto $subproduto
 *
 * @return Subpedido
 */
public function setSubproduto(\AppBundle\Entity\Subproduto $subproduto = null)
{
    $this->subproduto = $subproduto;

    return $this;
}

/**
 * Get subproduto
 *
 * @return \AppBundle\Entity\Subproduto
 */
public function getSubproduto()
{
    return $this->subproduto;
}

/**
 * Set pedido
 *
 * @param \AppBundle\Entity\Pedido $pedido
 *
 * @return Subpedido
 */
public function setPedido(\AppBundle\Entity\Pedido $pedido = null)
{
    $this->pedido = $pedido;

    return $this;
}

/**
 * Get pedido
 *
 * @return \AppBundle\Entity\Pedido
 */
public function getPedido()
{
    return $this->pedido;
}
}

SubpedidoType.php

<?php

namespace AppBundle\Form;

use Doctrine\ORM\EntityRepository;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class SubpedidoType extends AbstractType
{
/**
 * @param FormBuilderInterface $builder
 * @param array $options
 */
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $subcategorias = $options['subcategorias'];
    $builder
        ->add('quantidade')
        ->add('subproduto',EntityType::class, array(
            'class'=>'AppBundle:Subproduto',
            'expanded'=>true,
            'multiple'=>true,
            'label'=>false,
            'choice_label'=>function($subproduto){
                return $subproduto->getDescricao(). ' '. $subproduto->getValor();
            },
            'query_builder' => function(EntityRepository $er) use ( $subcategorias ){
                return $this->querySubcategorias($subcategorias, $er);
            },
        ))
    ;
}

/**
 * @param OptionsResolver $resolver
 */
public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'AppBundle\Entity\Subpedido',
        'subcategorias'=>null,
    ));
}


/**
 * @param $subcategorias, $er
 * Funcao que monta a query para filtrar as subcategorias existentes na categoria listada no pedido
 */
public function querySubcategorias($subcategorias, $er){
    $query = $er->createQueryBuilder('u'); //set repository categoria
    $count = 1;
    //na primeira montagem eh Where as demais andWhere
    foreach($subcategorias as $subcategoria){
        if($count<2)
            $query->where('u.subcategoria = ?'.$count)->setParameter($count,$subcategoria);
        else
            $query->orWhere('u.subcategoria =?'.$count)->setParameter($count,$subcategoria);
        $count++;
    }

    return $query;
}
}

SubpedidoController.php

<?php

namespace AppBundle\Controller;

use AppBundle\Entity\Pedido;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use AppBundle\Entity\Subpedido;
use AppBundle\Form\SubpedidoType;

/**
 * Subpedido controller.
 *
 * @Route("/subpedido")
 */
class SubpedidoController extends Controller
{
/**
 * Lists all Subpedido entities.
 *
 * @Route("/", name="subpedido_index")
 * @Method("GET")
 */
public function indexAction()
{
    $em = $this->getDoctrine()->getManager();

    $subpedidos = $em->getRepository('AppBundle:Subpedido')->findAll();

    return $this->render('subpedido/index.html.twig', array(
        'subpedidos' => $subpedidos,
    ));
}

/**
 * Creates a new Subpedido entity.
 *
 * @Route("/new/{categoria}/{pedido}", name="subpedido_new")
 * @Method({"GET", "POST"})
 */
public function newAction(Request $request, $categoria, $pedido)
{
    $subpedido = new Subpedido();
    $pedido = new Pedido($pedido);
    $em = $this->getDoctrine()->getManager();
    $subpedido->setPedido($pedido->getId());

    //busca todas as subcategorias da categoria escolhida
    $subcategoria = $em->getRepository('AppBundle:Subcategoria')->findBy(
        array('categoria'=>$categoria, 'ativo'=>1,));

    $form = $this->createForm('AppBundle\Form\SubpedidoType', $subpedido, array(
        'subcategorias'=>$subcategoria,
    ));
    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid()) {
        $em = $this->getDoctrine()->getManager();
        $em->persist($subpedido);
        $em->flush();

        return $this->redirectToRoute('subpedido_show', array('id' => $subpedido->getId()));
    }

    return $this->render('subpedido/new.html.twig', array(
        'subpedido' => $subpedido,
        'form' => $form->createView(),
    ));
}

/**
 * Finds and displays a Subpedido entity.
 *
 * @Route("/{id}", name="subpedido_show")
 * @Method("GET")
 */
public function showAction(Subpedido $subpedido)
{
    $deleteForm = $this->createDeleteForm($subpedido);

    return $this->render('subpedido/show.html.twig', array(
        'subpedido' => $subpedido,
        'delete_form' => $deleteForm->createView(),
    ));
}

/**
 * Displays a form to edit an existing Subpedido entity.
 *
 * @Route("/{id}/edit", name="subpedido_edit")
 * @Method({"GET", "POST"})
 */
public function editAction(Request $request, Subpedido $subpedido)
{
    $deleteForm = $this->createDeleteForm($subpedido);
    $editForm = $this->createForm('AppBundle\Form\SubpedidoType', $subpedido);
    $editForm->handleRequest($request);

    if ($editForm->isSubmitted() && $editForm->isValid()) {
        $em = $this->getDoctrine()->getManager();
        $em->persist($subpedido);
        $em->flush();

        return $this->redirectToRoute('subpedido_edit', array('id' => $subpedido->getId()));
    }

    return $this->render('subpedido/edit.html.twig', array(
        'subpedido' => $subpedido,
        'edit_form' => $editForm->createView(),
        'delete_form' => $deleteForm->createView(),
    ));
}

/**
 * Deletes a Subpedido entity.
 *
 * @Route("/{id}", name="subpedido_delete")
 * @Method("DELETE")
 */
public function deleteAction(Request $request, Subpedido $subpedido)
{
    $form = $this->createDeleteForm($subpedido);
    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid()) {
        $em = $this->getDoctrine()->getManager();
        $em->remove($subpedido);
        $em->flush();
    }

    return $this->redirectToRoute('subpedido_index');
}

/**
 * Creates a form to delete a Subpedido entity.
 *
 * @param Subpedido $subpedido The Subpedido entity
 *
 * @return \Symfony\Component\Form\Form The form
 */
private function createDeleteForm(Subpedido $subpedido)
{
    return $this->createFormBuilder()
        ->setAction($this->generateUrl('subpedido_delete', array('id' => $subpedido->getId())))
        ->setMethod('DELETE')
        ->getForm()
    ;
}
}

0 个答案:

没有答案