我有2个表,Subproduto和Subpedido,subpedido有很多subproduto。首先,我尝试使属性$subprodutos
类型json_array
,但实体类型返回{}
数组为空。然后我仍然尝试关系,但没有成功。
<?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;
}
}
<?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;
}
}
<?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;
}
}
<?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()
;
}
}