Подтвердить что ты не робот

Есть ли способ указать порядок по умолчанию для модели Doctrine 2?

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

Из того, что я собираю, это невозможно сделать в Доктрине 2. Очевидно, они хотят, чтобы вы создавали запрос.

Было бы очень СУХОЙ, логичной и удобной функцией включить, и очень глупая функция, чтобы отказаться от нее, мне кажется.

Я искренне надеюсь, что я ошибаюсь в отношении этого варианта, который не существует, и прежде чем я буду плакать, чтобы спать сегодня вечером, я хотел проверить, может ли Doctrine действительно иметь способ указать порядок по умолчанию, и у меня просто нет смог найти его. Может ли кто-нибудь просветить меня?

4b9b3361

Ответ 1

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

Ответ 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 фокусируется на объектных моделях с отношениями. Есть альтернативные альтернативы, основанные на активной записи.

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

Ответ 3

Пока вы, похоже, не можете сделать это для всей модели 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);
    }
}

Ответ 4

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

public function findAll()
{
    return $this->findBy(array(), array('lft'=>'asc'));  
}

Ответ 5

Относительно простой способ добиться этого - переопределить метод 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, если это необходимо.

Ответ 6

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

$accounts = $this->em->getRepository('Entities\User')
                     ->findBy(array('active' => 1), array('email' => 'ASC'));