首页 > 解决方案 > Api 平台:实体级联上的订单

问题描述

使用Api Platform,我们可以通过关联订购。

文档

use ApiPlatform\Core\Annotation\ApiResource;

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

但我想订购实体级联。

对于下面的示例,我对此错误进行了测试:

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

[语义错误] 第 0 行,第 422 列,靠近 'id ASC,rests_a6.id':错误:App\Entity\TrainingSerieExercise 类没有名为 repeats.id 的字段或关联

TrainingSerie实体 :

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

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

...

TrainingSerieExercise实体 :

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

TrainingSerieExerciseRepetition实体 :

class TrainingSerieExerciseRepetition
{
    ...
    /**
     * @var integer
     *
     * @ORM\Id
     * @ORM\Column(name="id", type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     * @Groups({
     *     "training_series_read",
     * })
     */
    private $id;
    ...

标签: symfonyapi-platform.com

解决方案


按照这个Doctrine 文档,这将按 ID 订购 TrainingSerieExercise::$repetitions:

class TrainingSerieExercise
{
    ...
    /**
     * @var TrainingSerieRepetition[]|ArrayCollection
     *
     * @ORM\OneToMany(
     *     targetEntity="App\Entity\TrainingSerieExerciseRepetition",
     *     mappedBy="exercise",
     *     cascade={"persist"},
     * )
     * @ORM\OrderBy({"id" = "ASC"})
     * @Groups({
     *     "training_series_read",
     *     "training_series_write",
     *     "training_serie_exercices_write",
     * })
     */
    private $repetitions;
    ...

推荐阅读