2
votes

Hey guys i have the next two entities:

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

 /**
     * @var DbaCustomFields
     *
     * @ORM\ManyToOne(targetEntity="DbaCustomFields", inversedBy="inqueritoExtraFields")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="id_custom_field", referencedColumnName="id", onUpdate="cascade", onDelete="cascade", nullable = false)
     * })
     */
    private $idCustomField;
}

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

    /**
     * @ORM\OneToMany(targetEntity="CarInqueritoExtraFields", mappedBy="idCustomField", cascade={"persist"})
     */
    private $inqueritoExtraFields;

    /**
     * @var integer $idContacto
     *
     * @ORM\Column(name="nome", type="string", nullable=true)
     */
    private $nome;  
}

Both of these Entities have gets/sets. I have the following method in my DbaCustomFieldsRepository:

public function getCustomFieldsNotUsed($idInquerito) {

        $qb = $this->getEntityManager()->createQueryBuilder();
        $qb2 = $this->getEntityManager()->createQueryBuilder();

        $qb->select('cf')
                ->from('CareAdminBundle:DbaCustomFields', 'cf')
                ->where($qb->expr()->notIn('cf.id', $qb2->select('ief.idCustomField')
                                ->from('CareAdminBundle:CarInqueritoExtraFields', 'ief')
                                ->where('ief.idInquerito = :idInquerito')
                                ->getDQL()))
                ->setParameter('idInquerito', $idInquerito);

        return $qb;
    }

I get $qb in my formBuilder:

 public function buildForm(FormBuilder $builder, array $options){

        $id_inquerito = $this->id_inquerito;
        $builder->add('idCustomField', 'entity', array(
                    'empty_value' => 'Escolha um campo',
                    'class' => 'Care\AdminBundle\Entity\DbaCustomFields',
                    'required' => false,
                    'query_builder' => function(\Care\AdminBundle\Repository\DbaCustomFieldsRepository $repository) use ($id_inquerito){
                        return $repository->getCustomFieldsNotUsed($id_inquerito);
                    }));     
    }

But i got this error but i cant figured out why:

An exception has been thrown during the rendering of a template ("[Semantical Error] line 0, col 80 near 'idCustomField': Error: Invalid PathExpression. Must be a StateFieldPathExpression.") in ::base.html.twig at line 19.

I think the problem should be in my QueryBuilder, but i don know why.. Any help is appreciated! THANKS :)

----------------------------------UPDATE--------------------------------------------- Well i manage to get the solution, maybe isn't the proper way, but well it works. The problem was on the querybuilder, so i did this:

//First i pick the CarInqueritoExtraFields By IdInquerito and save the idCustomField from the retrieved object in a array.

 $em = $this->getEntityManager();
        $carInqueritoExtraFieldsByIdInquerito = $em->getRepository('CareAdminBundle:CarInqueritoExtraFields')->findByIdInquerito($idInquerito);
        $arrayExtraFields = array();
        foreach ($carInqueritoExtraFieldsByIdInquerito as $extraField) {
        array_push($arrayExtraFields, $extraField->getIdCustomField()->getId());
    }

//Then this:
 $qb->select('cf')
            ->from('CareAdminBundle:DbaCustomFields', 'cf')
                ->where($qb->expr()->notIn('cf.id', $arrayExtraFields));

If anyone get a better way, feel free to tell me :)

1

1 Answers

2
votes

You're trying to nest querybuilders, which is totally invalid Doctrine. Use a join instead.