2014-09-04 14 views
7

Ho un tipo di dati personalizzato, che funziona come previsto quando si utilizza FindBy ... ma non quando si utilizza Query Builder. Ci scusiamo per il post lungo, ma immagino che più informazioni dovrebbero aiutare.Symfony Doctrine datatype funziona solo in findBy non in querybuilder

E 'lo stesso di questa domanda senza risposta: Doctrine 2 Custom Types

tipo di dati:

... 
class MyHappyType extends Type 
{ 
    ... 
    public function convertToDatabaseValue($value, AbstractPlatform $platform) 
    { 
     return 'hippies: '.$value; 
    } 

    public function convertToPHPValue($value, AbstractPlatform $platform) 
    { 
     return 'doubleHippies: '.$value; 
    } 
    ... 
    public function getName() 
    { 
     return 'hippies'; 
    } 
} 

Entity:

// Entity class 

... 
class Hippie 
{ 

    /** 
    * @ORM\Id 
    * @ORM\Column(type="integer", unique=true) 
    */ 
    protected $id; 

    /* 
    * @ORM\Column(type="hippies") 
    */ 
    protected $Sandals; 

} 

Repository:

... 
class HippiesRepository extends EntityRepository 
{ 
    public function useQueryBuilder($sandals){ 
     $qb = $this->createQueryBuilder('hippie'); 
     $qb->select('hippie') 
      ->where('hippie.Sandals = :sandals') 
      ->setParameter('sandals', $sandals); 

     return $qb->getQuery()->getResult(); 
    } 
} 

E, infine, Controller:

public function hippiesAction() 
{ 
    // this returns an entity with $hippie1->sandals == 'doubleHippies: hippies: red' 
    // which is expected behaviour 
    $hippie1 = $em->getRepository('HappyHippiesBundle:Hippie')->findOneBySandals('red'); 

    // this one returns no results, when checking queries run I see that 
    // $sandals value isn't translated in to 'hippies: red' 
    $hippie2 = $em->getRepository('HappyHippiesBundle:Hippie')->useQueryBuilder('red'); 
} 

Così, in breve, tipi di dati non vengono convertiti quando si utilizza QueryBuilder, solo quando si utilizza findBy ...

+0

Pensandoci un po 'di più, sembra coerente che i tipi personalizzati non vengano presi in considerazione quando si utilizza il generatore di query. Sono collegati all'entità, non è rilevante in una query, che è solo una query. Quindi immagino che la domanda sia: come si usano i metodi in tipi personalizzati in un repository? – offwhite

risposta

1

è necessario definire la classe repository nella configurazione entità:

/** 
* @ORM\Entity(repositoryClass=""AcmeDemoBundle\Entity\HippiesRepository") 
*/ 
class Hippie 
{ 
    // ... 
} 

vedere Custom Repository classes per ulteriori informazioni.

Aggiornamento:

Si consiglia inoltre di sbarazzarsi del ->select('hippie'). Quando si utilizza il metodo per creare un QueryBuilder nella classe repository, il metodo chiamerà automaticamente i metodi select e from (vedere il file EntityRepository.php per ulteriori informazioni). In questo caso non devi fare altro che:

$qb = $this->createQueryBuilder('hippie'); 
$qb->where('hippie.Sandals = :sandals') 
    ->setParameter('sandals', $sandals); 

return $qb->getQuery()->getResult(); 
Problemi correlati