2016-08-25 3 views
1

У меня есть Entity, называемая «InterestGroup», которая имеет ассоциацию самореференции (список смежности) в виде свойств «дети» (один для многих) и «родитель» (многие к одному).Symfony Entity Тип поля, где предложение в Query Builder не работает с ассоциацией самоначислений «один-ко-многим»

При создании типа формы для InterestGroup я пытаюсь предоставить список выбора для родительского свойства, у которого есть выбор из всех групп интересов «верхнего уровня» (те, чье «родительское» свойство равно null). Когда я добавляю предложение where и нулевой параметр в query_builder для поля EntityType, он всегда ничего не возвращает, даже если у меня есть несколько верхних уровней (родительский null), группы интересов сохраняются. Если я удалю предложение where, он вернет все заинтересованные группы в таблице. Мне сложно понять, почему предложение where не работает.

Это поле вопроса:

->add('parent',EntityType::class, 
    array(
     'placeholder' => 'Top Level (No Parent)', 
     'required' => false, 
     'class' => 'Common\ContentBundle\Entity\InterestGroup', 
     'query_builder' => function (EntityRepository $er) { 
      return $er->createQueryBuilder('ig') 
       ->where('ig.parent = :n') 
       ->setParameter('n',null) 
       ->orderBy('ig.title', 'ASC'); 
     }, 
     'choice_label' => 'title' 
    ) 
) 

выше возвращает пустое меню выбора. Удалив предложение where и setparameter, я получаю все объекты InterestGroup, включая все те, у которых есть нулевые родители.

Ниже класса сущностей для InterestGroup

<?php 

namespace Common\ContentBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Doctrine\Common\Collections\ArrayCollection; 
use Symfony\Component\Validator\Constraints as Assert; 
use Gedmo\Mapping\Annotation as Gedmo; 

/** 
* InterestGroup 
* 
* @ORM\Table(name="interest_group") 
* @ORM\Entity(repositoryClass="Common\ContentBundle\Repository\InterestGroupRepository") 
*/ 
class InterestGroup 
{ 
    /** 
    * @var int 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="title", type="string", length=255, unique=true) 
    * @Assert\NotBlank(message="This is a required field.") 
    */ 
    private $title; 

    /** 
    * @ORM\OneToMany(targetEntity="InterestGroup", mappedBy="parent") 
    */ 
    private $children; 

    /** 
    * @ORM\ManyToOne(targetEntity="InterestGroup", inversedBy="children") 
    * @ORM\JoinColumn(name="parent_id", referencedColumnName="id") 
    */ 
    private $parent; 

    /** 
    * @Gedmo\Slug(fields={"title"}) 
    * @ORM\Column(length=128, unique=true) 
    */ 
    private $slug; 

    // ... 
    /** 
    * @ORM\ManyToMany(targetEntity="Product", mappedBy="interestGroups") 
    */ 
    private $products; 


    /** 
    * InterestGroup constructor. 
    */ 
    public function __construct() 
    { 
     $this->children = new ArrayCollection(); 
     $this->products = new ArrayCollection(); 

    } 

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

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

    /** 
    * @param string $title 
    */ 
    public function setTitle($title) 
    { 
     $this->title = $title; 
    } 


    /** 
    * @return mixed 
    */ 
    public function getSlug() 
    { 
     return $this->slug; 
    } 

    /** 
    * @return mixed 
    */ 
    public function getChildren() 
    { 
     return $this->children; 
    } 

    /** 
    * @param mixed $children 
    */ 
    public function setChildren($children) 
    { 
     $this->children = $children; 
    } 

    /** 
    * @return mixed 
    */ 
    public function getParent() 
    { 
     return $this->parent; 
    } 

    /** 
    * @param mixed $parent 
    */ 
    public function setParent($parent) 
    { 
     $this->parent = $parent; 
    } 

    /** 
    * @return mixed 
    */ 
    public function getProducts() 
    { 
     return $this->products; 
    } 
} 

и форма Тип Класс:

<?php 

namespace Common\ContentBundle\Form; 

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

class InterestGroupType extends AbstractType 
{ 
    /** 
    * @param FormBuilderInterface $builder 
    * @param array $options 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('title',TextType::class) 
      ->add('parent',EntityType::class, 
       array(
       'placeholder' => 'Top Level (No Parent)', 
       'required' => false, 
       'class' => 'Common\ContentBundle\Entity\InterestGroup', 
       'query_builder' => function (EntityRepository $er) { 
        return $er->createQueryBuilder('ig') 
         ->where('ig.parent = :n') 
         ->setParameter('n',null) 
         ->orderBy('ig.title', 'ASC'); 
       }, 
       'choice_label' => 'title' 
      ) 
      ) 
     ; 
    } 

    /** 
    * @param OptionsResolver $resolver 
    */ 
    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'Common\ContentBundle\Entity\InterestGroup' 
     )); 
    } 
} 

Заранее спасибо!

ответ

1

Проверьте ваш код здесь:

return $er->createQueryBuilder('ig') 
      ->where('ig.parent = :n') // <--- 
      ->setParameter('n',null) // <--- 
      ->orderBy('ig.title', 'ASC'); 

Это то же самое:

... WHERE ig.parent = NULL ... 

Таким образом, этот запрос всегда возвращает пустой набор данных.

Правый код:

return $er->createQueryBuilder('ig') 
      ->where('ig.parent IS NULL') 
      ->orderBy('ig.title', 'ASC'); 

IS NULL Используйте для проверки нулевых значений.

Эта проблема связана с what is "=null" and " IS NULL"