Ответ 1
Похоже, нет, нет способа указать порядок по умолчанию в Doctrine 2.
В Rails (и даже в Doctrine < 2, IIRC) вы можете указать порядок по умолчанию для любой модели. Например, если вы укажете Rails, чтобы всегда заказывать таблицу customer
на name
, Customer.all
всегда будет списком клиентов, заказанных name
. Это имеет огромное значение.
Из того, что я собираю, это невозможно сделать в Доктрине 2. Очевидно, они хотят, чтобы вы создавали запрос.
Было бы очень СУХОЙ, логичной и удобной функцией включить, и очень глупая функция, чтобы отказаться от нее, мне кажется.
Я искренне надеюсь, что я ошибаюсь в отношении этого варианта, который не существует, и прежде чем я буду плакать, чтобы спать сегодня вечером, я хотел проверить, может ли Doctrine действительно иметь способ указать порядок по умолчанию, и у меня просто нет смог найти его. Может ли кто-нибудь просветить меня?
Похоже, нет, нет способа указать порядок по умолчанию в Doctrine 2.
$items = $entityManager()->getRepository('Item')->findBy(array(),array('field_to_sort_on'));
И, конечно, вы можете просто добавить метод в репозиторий товаров
public function findAllWithDefaultSort()
{
return $this->findBy(array(),array('default_field_to_sort_on'));
}
Никакой реальной необходимости делать запрос в этом случае. Имейте в виду, что D2 фокусируется на объектных моделях с отношениями. Есть альтернативные альтернативы, основанные на активной записи.
Чтобы ответить на ваш вопрос: Нет.
Пока вы, похоже, не можете сделать это для всей модели ala Doctrine 1, вы можете указать упорядочение как нотацию на обратной стороне отношения:
// Entity/Category
/**
* @var ArrayCollection $posts
*
* @ORM\OneToMany(targetEntity="Post", mappedBy="category")
* @ORM\OrderBy({"name" = "ASC"})
*/
private $posts;
Кроме того, если вы реализуете службы менеджера сущностей, такие как SonataNewsBundle, вы можете указать значения по умолчанию с помощью необязательных аргументов i.e.
class PostManager extends ModelPostManager
{
/**
* {@inheritDoc}
*/
public function findBy(array $criteria, array $orderBy = array('name' => 'asc'))
{
return $this->em->getRepository($this->class)->findBy($criteria, $orderBy);
}
}
У меня был тот же вопрос, я обнаружил, что переопределение функции findAll()
в вашем репозитории работает очень хорошо:
public function findAll()
{
return $this->findBy(array(), array('lft'=>'asc'));
}
Относительно простой способ добиться этого - переопределить метод findBy
в классе репозитория Entity:
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
, если это необходимо.
findBy параметр 1 является критерием поиска, параметр 2 является упорядоченным и, по-видимому, должен принимать либо ASC (возрастающий), либо DESC (убывающий)
$accounts = $this->em->getRepository('Entities\User')
->findBy(array('active' => 1), array('email' => 'ASC'));