Платформа Api: порядок в каскаде объектов

#symfony #api-platform.com

#symfony #api-platform.com

Вопрос:

С помощью платформы Api мы можем делать заказы по ассоциации.

Документация :

 use ApiPlatformCoreAnnotationApiResource;

/**
 * @ApiResource(attributes={"order"={"author.username"}})
 */
class Book
{
    ...
 

Но я хочу сделать заказ в каскаде объектов.

В приведенном ниже примере я проверил это с помощью этой ошибки :

  * @ApiResource(
 *     attributes={
 *         "order"={"exercises.repetitions.id":"asc"}
 *     }
 * )
 

[Семантическая ошибка] строка 0, col 422 рядом с ‘id ASC, rests_a6.id ‘: Ошибка: класс AppEntityTrainingSerieExercise не имеет имени поля или ассоциации repetitions.id

TrainingSerie объект :

  * @ApiResource(
       ...
 *     attributes={
 *         "order"={"exercises.repetitions.id":"asc"}
 *     }
 * )
 */
class TrainingSerie
{
    ...

    /**
     * @var TrainingSerieExercise[]|ArrayCollection
     *
     * @ORMOneToMany(
     *     targetEntity="AppEntityTrainingSerieExercise",
     *     mappedBy="serie",
     *     cascade={"persist"}
     * )
     * @Groups({
     *     "trainings_read",
     *     "training_series_read",
     *     "training_series_write",
     * })
     */
    private $exercises;

...
 

TrainingSerieExercise объект :

 ...
class TrainingSerieExercise
{
    ...
    /**
     * @var TrainingSerieRepetition[]|ArrayCollection
     *
     * @ORMOneToMany(
     *     targetEntity="AppEntityTrainingSerieExerciseRepetition",
     *     mappedBy="exercise",
     *     cascade={"persist"},
     * )
     * @Groups({
     *     "training_series_read",
     *     "training_series_write",
     *     "training_serie_exercices_write",
     * })
     */
    private $repetitions;
    ...
 

TrainingSerieExerciseRepetition объект :

 class TrainingSerieExerciseRepetition
{
    ...
    /**
     * @var integer
     *
     * @ORMId
     * @ORMColumn(name="id", type="integer")
     * @ORMGeneratedValue(strategy="AUTO")
     * @Groups({
     *     "training_series_read",
     * })
     */
    private $id;
    ...
 

Комментарии:

1. Это не имеет большого смысла. $repetitions это коллекция, у нее не может быть индивидуального идентификатора. Совершенно непонятно, чего именно вы хотите достичь.

2. Спасибо за ваш ответ 🙂 Да, repetitions это коллекция ( TrainingSerieExerciseRepetition[] ), и каждый элемент этой коллекции содержит два поля ( id и repetition ). Я хочу, чтобы родительская сущность ( TrainingSerie ) упорядочила эту коллекцию по id (но это могло быть и по repetition ).

Ответ №1:

Следуя этому документу Doctrine, это упорядочит TrainingSerieExercise::$repetitions по идентификатору:

 class TrainingSerieExercise
{
    ...
    /**
     * @var TrainingSerieRepetition[]|ArrayCollection
     *
     * @ORMOneToMany(
     *     targetEntity="AppEntityTrainingSerieExerciseRepetition",
     *     mappedBy="exercise",
     *     cascade={"persist"},
     * )
     * @ORMOrderBy({"id" = "ASC"})
     * @Groups({
     *     "training_series_read",
     *     "training_series_write",
     *     "training_serie_exercices_write",
     * })
     */
    private $repetitions;
    ...