Есть ли способ указать порядок по умолчанию для модели Doctrine 2? - PullRequest
22 голосов
/ 02 апреля 2012

В Rails (и даже в Doctrine <2, IIRC) вы можете указать порядок по умолчанию для любой модели.Например, если вы скажете Rails всегда заказывать вашу таблицу <code>customer по name, Customer.all всегда будет список клиентов, заказанных по name.Это имеет огромное количество смысла.

Насколько я понимаю, это невозможно сделать в Doctrine 2. Очевидно, они хотят, чтобы вы создали запрос вместо этого.Мне кажется, это было бы очень СУХОЙ, логичной и удобной функцией, а также невероятно глупой функцией, которую можно было бы опустить.прежде чем я плачу себе сегодня ночью, я хотел проверить, есть ли в Doctrine способ указать порядок по умолчанию, и я просто не смог его найти.Может ли кто-нибудь просветить меня?

Ответы [ 6 ]

35 голосов
/ 02 июля 2012

Хотя вы, похоже, не можете сделать это для всей модели, как в «Доктрине 1», вы можете указать порядок в виде записи на обратной стороне отношения:

// Entity/Category

/**
 * @var ArrayCollection $posts
 *
 * @ORM\OneToMany(targetEntity="Post", mappedBy="category")
 * @ORM\OrderBy({"name" = "ASC"})
 */
private $posts;

Также, есливы реализуете службы менеджера сущностей, такие как SonataNewsBundle , вы можете указать значения по умолчанию с помощью необязательных аргументов, например

class PostManager extends ModelPostManager
{

    /**
     * {@inheritDoc}
     */
    public function findBy(array $criteria, array $orderBy = array('name' => 'asc'))
    {
        return $this->em->getRepository($this->class)->findBy($criteria, $orderBy);
    }
}
28 голосов
/ 02 апреля 2012
$items = $entityManager()->getRepository('Item')->findBy(array(),array('field_to_sort_on'));

И, конечно, вы можете просто добавить метод в репозиторий Item

public function findAllWithDefaultSort()
{
    return $this->findBy(array(),array('default_field_to_sort_on'));
}

Нет реальной необходимости делать запрос в этом случае. Имейте в виду, что D2 фокусируется на объектных моделях с отношениями. Существует множество альтернатив, основанных на записях.

Чтобы ответить на ваш вопрос: Нет.

23 голосов
/ 02 октября 2012

У меня был тот же вопрос, я обнаружил, что переопределение функции findAll() в вашем репозитории работает довольно хорошо:

public function findAll()
{
    return $this->findBy(array(), array('lft'=>'asc'));  
}
8 голосов
/ 02 июля 2013

Относительно простой способ добиться этого - переопределить метод findBy в классе хранилища сущности:

class MyEntityRepository extends EntityRepository
{
    /**
     * @inheritdoc
     */
    public function findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
    {
        $orderBy = $orderBy === null ? array('added' => 'desc') : $orderBy;
        return parent::findBy($criteria, $orderBy, $limit, $offset);
    }
}

Это добавляет порядок по умолчанию ко всем методам findBy и позволяет вам переопределить порядок, если вам нужно. То же самое можно сделать для findOneBy, если необходимо.

6 голосов
/ 03 апреля 2012

Похоже, нет, нет способа указать порядок по умолчанию в Doctrine 2.

3 голосов
/ 25 августа 2012

Параметр findBy 1 является критерием поиска, параметр 2 - порядком и, похоже, должен принимать либо ASC (по возрастанию), либо DESC (по убыванию)

$accounts = $this->em->getRepository('Entities\User')
                     ->findBy(array('active' => 1), array('email' => 'ASC'));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...