2016-11-25 1 views
-1

Как найти записи, начинающиеся с заданного символа?Symfony2 Как найти записи, начинающиеся с заданного символа?

, например: только пользователи, где имя пользователя начинается с А

пользователя класса

<?php 

    namespace DemoBundle\Entity; 

    use FOS\UserBundle\Model\User as BaseUser; 
    use Doctrine\ORM\Mapping as ORM; 

    /** 
    * @ORM\Entity 
    * @ORM\Table(name="fos_user") 
    */ 
    class User extends BaseUser 
    { 

     /** 
     * @ORM\Id 
     * @ORM\Column(type="integer") 
     * @ORM\GeneratedValue(strategy="AUTO") 
     */ 
     protected $id; 

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

     /** 
     * @ORM\Column(type="string", length=50) 
     */ 
     protected $lastname; 

     public function __construct() 
     { 
      parent::__construct(); 
      // your own logic 
     } 
    //getters and setters 
    } 

и действие контроллера с раствором @Kwido

public function listAction($letter) 
    { 
     $queryBuilder = $this->getEntityManager()->createQueryBuilder(); 
     $queryBuilder 
      ->select(['user']) 
      ->from(User::class, 'user') 
      ->andWhere($queryBuilder->expr()->like('user.lastname', ':lastname')) 
      ->setParameter('lastname', $queryBuilder->expr()->literal('A%')); 

     $result = $queryBuilder->getQuery()->getResult(); 

     die(var_dump($result)); 
} 

это все, что у меня есть. Это дает мне ошибку

Пытался вызвать неопределенный метод под названием "getEntityManager" из класса DemoBundle \ Controller \ контроллера по умолчанию»

+0

В классе контроллера для получения EntityManager вам нужно вызывать '$ this-> getDoctrine() -> getManager()' вместо '$ this-> getEntityManager()'. Изменили его и повторите попытку. – rogeriolino

+0

Спасибо, это работает. Но запрос возвращает null. В базе данных у меня около 4k случайных пользователей. –

ответ

1

Hi @Damian измените код на него.

public function listAction($letter) 
{ 
    $result = $this->getDoctrine() 
        ->getManager() 
        ->createQueryBuilder() 
        ->select('u') 
        ->from(User::class, 'u') 
        ->where('u.lastname LIKE :lastname') 
        ->setParameter('lastname', 'A%') 
        ->getQuery() 
        ->getResult(); 

    dump($result); 

    // return response bellow 
} 

Когда страница загружается, щелкните в профилировщике Symfony и перейдите в раздел базы данных. Посмотрите сгенерированный запрос и попробуйте запустить его непосредственно в базе данных.

+0

работает отлично! Спасибо! –

0

Используйте QueryBuilder Like выража Учения:

// Example - $qb->expr()->like('u.firstname', $qb->expr()->literal('Gui%')) 
public function like($x, $y); // Returns Expr\Comparison instance 

Использование выражения Like в вашем Репозиторий класс:

// getEntityManager() = $this->getDoctrine()->getManager(); 
$queryBuilder = $this->getEntityManager()->createQueryBuilder(); 
$queryBuilder 
    ->select(['user']) 
    ->from(User::class, 'user') 
    ->andWhere($queryBuilder->expr()->like('user.userName', ':userName')) 
    ->setParameter('userName', $queryBuilder->expr()->literal('A%')); 

$result = $queryBuilder->getQuery()->getResult(); 
+0

Я абсолютно не понимаю, как выглядит ваш код, поэтому я просто сделал вам базовое решение. Вы не указываете, какую ошибку он дал вам, поэтому вам очень сложно помочь. Вы должны предоставить дополнительную информацию, если хотите, чтобы люди вам помогли. Что касается конструктора запросов, то сопоставление может быть как в 'userName' может быть' username', так как я не знаю, как ваша сущность сопоставляется и не знает, какие свойства содержит ваша сущность. Поэтому настройте его по своему усмотрению или предоставите дополнительную информацию для дальнейшей помощи. – Kwido

+0

Я добавил новый ответ на ваше решение –