Как отсортировать метод findAll Doctrine

читал Учениедокументация, но у меня нетне удалось найти способ сортировки результатов findAll ().

м, используя доктрину Symfony2 +, это утверждение, что яЯ использую внутри моего контроллера:

$this->getDoctrine()->getRepository('MyBundle:MyTable')->findAll();

но я хочу, чтобы результаты упорядочивались по возрастанию имени пользователя.

мы пытались передать массив в качестве аргумента следующим образом:

findAll( array('username' => 'ASC') );

но это нене работает (это неЖаловаться тоже).

Есть ли способ сделать это без построения запроса DQL?

Ответы на вопрос(12)

Просто:

$this->getDoctrine()->getRepository('AcmeBundle:User')->findBy(
    array(),
    array('username' => 'ASC')
);
 Robert Saylor10 сент. 2018 г., 20:29
Это работает как шарм! И до сих пор работает именно так с Symfony 4

Я использую альтернативу решению, которое написал NIFR.

$resultRows = $repository->fetchAll();
uasort($resultRows, function($a, $b){
    if ($a->getProperty() == $b->getProperty()) {
        return 0;
    }
    return ($a->getProperty()< $b->getProperty()) ? -1 : 1;
});

Это'быстрее чемСОРТИРОВАТЬ ПО предложение и без накладных расходов Итератора.

 Alok Patel01 апр. 2015 г., 15:44
Это сработало для меня!

Это работает для меня:

$entities = $em->getRepository('MyBundle:MyTable')->findBy(array(),array('name' => 'ASC'));

Сохранение первого массива пустым возвращает все данные, в моем случае это сработало.

Вам нужно использовать критерии, например:

getDoctrine()->getManager()->getRepository('Bundle:Thing');
        $things = $rep->matching($criteria);
        return $this->render('Bundle:Thing:things.html.twig', [
            'entities' => $things,
        ]);
    }
}
$this->getDoctrine()->getRepository('MyBundle:MyTable')->findBy([], ['username' => 'ASC']);
 Dinuka Thilanga08 апр. 2015 г., 12:25
Это простое решение.
 Allahbakash.G26 окт. 2016 г., 15:19
очень простое решение, спасибо striiig

Вы можете отсортировать существующую коллекцию ArrayCollection с помощью итератора массива.

при условии, что $ collection является вашей коллекцией ArrayCollection, возвращаемой функцией findAll ()

$iterator = $collection->getIterator();
$iterator->uasort(function ($a, $b) {
    return ($a->getPropery() < $b->getProperty()) ? -1 : 1;
});
$collection = new ArrayCollection(iterator_to_array($iterator));

Это можно легко превратить в функцию, которую вы можете поместить в свой репозиторий для создания метода findAllOrderBy ().

 Lighthart23 янв. 2014 г., 20:06
В общем, возвращение упорядоченного запроса должно быть базой данныхс работой. OTOH, эта техника действительно применима к более сложным случаям, о которых ни упоминает.
 nifr21 окт. 2013 г., 15:36
Какие'Ваша точка зрения здесь? Для этого более чем достаточно сценариев использования ... то есть сортировка уже извлеченной коллекции в PHP всегда быстрее, чем выполнение другого запроса mysql только для сортировки! Представьте, что вам нужно вывести одни и те же данные коллекции в двух разных стилях сортировки на одной странице ...

Метод findBy в Symfony допускает два параметра. Первый - это массив полей, по которым вы хотите искать, а второй - это поле сортировки и его порядок.

public function findSorted()
    {
        return $this->findBy(['name'=>'Jhon'], ['date'=>'DESC']);
    }
 silwar20 нояб. 2018 г., 10:21
пожалуйста, предоставьте описание вашего кода
 Nico Haase20 нояб. 2018 г., 10:00
Можете ли вы добавить некоторые объяснения к вашему очень короткому ответу?
 Paul Hodges20 нояб. 2018 г., 15:29
Тот'Могучий короткий ответ. Разработать - объяснить ...редактировать.

Посмотрите на исходный код Doctrine API:

class EntityRepository{
  ...
  public function findAll(){
    return $this->findBy(array());
  }
  ...
}

Измените функцию findAll по умолчанию в EntityRepository следующим образом:

public function findAll( array $orderBy = null )
{
    return $this->findBy([], $orderBy);
}

Таким образом, вы можете использоватьнайти все'' на любой запрос для любой таблицы данных с возможностью сортировки запроса

Решение Вопроса

Как показано на @Lighthart, да, это такЭто возможно, хотя это добавляет значительный жир к контроллеру и нет сухой.

Вы действительно должны определить свой собственный запрос в хранилище сущностей, это 'Простая и лучшая практика.

use Doctrine\ORM\EntityRepository;

class UserRepository extends EntityRepository
{
    public function findAll()
    {
        return $this->findBy(array(), array('username' => 'ASC'));
    }
}

Затем вы должны указать своей сущности искать запросы в хранилище:

/**
 * @ORM\Table(name="User")
 * @ORM\Entity(repositoryClass="Acme\UserBundle\Entity\Repository\UserRepository")
 */
class User
{
    ...
}

Наконец, в вашем контроллере:

$this->getDoctrine()->getRepository('AcmeBundle:User')->findAll();
 ILikeTacos15 июн. 2013 г., 18:22
ну это такЯ не боюсь dql, и прежде чем читать этот ответ, я в конечном итоге использовал DQL для достижения этой цели, но я неЯ не хотел использовать DQL в начале, потому что в моем контроллере не было DQL, и я хотел придерживаться стиля кода, который уже был у контроллера. Это решение работает очень хорошо для меня!
 Benji_X8023 окт. 2014 г., 11:54
Или просто: $ this->getDoctrine () ->getRepository (»AcmeBundle: Пользователь») ->findBy (array (), array ('имя пользователя '=> 'ASC»));
 eddy14711 окт. 2016 г., 11:59
Для тех из вас, кто хочет отсортировать связанные объекты, см.stackoverflow.com/questions/22828669/...
 pregmatch05 дек. 2013 г., 12:54
@ Пьер-Люк Жандро так просто, так умно :)
 Lighthart15 июн. 2013 г., 10:22
Это лучший подход, чем мой, но вы будете писать dql; мой метод имеет меньше dql и поэтому отвечает на OP 'С ограничением. Честно говоря, страх перед dql должен быть просто преодолен. Используйте этот метод вместо моих, если это возможно.
 Pier-Luc Gendreau15 дек. 2014 г., 20:55
@ Sejanus ЭтоКак документы хотят, чтобы вы это делали:symfony.com/doc/current/book/...
 Sejanus15 дек. 2014 г., 11:04
Можете ли вы сказать сущности искать запросы в пользовательском репозитории любым другим способом, кроме использования комментариев? Это'самая ужасная практика программирования, которую ямы когда-либо видели
 Pier-Luc Gendreau23 окт. 2014 г., 17:34
@ Benji_X80 Несмотря на то, что эта строка, конечно, короче, она не СУХАЯ. Метод findAll принадлежит хранилищу, а не контроллеру.

Это'Иногда полезно взглянуть на исходный код.

НапримерfindAll реализация очень проста (vendor/doctrine/orm/lib/Doctrine/ORM/EntityRepository.php):

public function findAll()
{
    return $this->findBy(array());
}

Итак, мы смотрим наfindBy и найти то, что нам нужно ()orderBy

public function findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)

Попробуй это:

$em = $this->getDoctrine()->getManager();

$entities = $em->getRepository('MyBundle:MyTable')->findBy(array(), array('username' => 'ASC'));

Ваш ответ на вопрос