Встраивание отношений в результаты - PullRequest
0 голосов
/ 15 ноября 2018

Я использую API-платформу для доставки контента через API.У меня есть Потенциальные отношения между пользователями и участниками (не у всех пользователей будут участники, но у всех участников будет хотя бы один пользователь).Моя главная цель - встроить пользовательские данные отношения в результирующий набор участников, поскольку этот результат будет использоваться таблицей данных, и было бы более эффективно, чтобы эти данные уже присутствовали в результате, а не выполнять дополнительный запрос данных..

Например:

{
  "@context": "/api/contexts/Participants",
  "@id": "/api/participants",
  "@type": "hydra:Collection",
  "hydra:member": [
    {
      "@id": "/api/participants/1",
      "@type": "Participants",
      "id": 1,
      "name": "Jeffrey Jones",
      "users": [
        {
          "@id": "/api/users/1",
          "@type": "User",
          "name": "Jenny Jones"
        },
        {
          "@id": "/api/users/2",
          "@type": "User",
          "name": "Jessie Jones"
        }
      ]
    }
  ],
  "hydra:totalItems": 1
}

Однако я не уверен, возможно ли это.Я посмотрел на https://api -platform.com / docs / core / serialization # embedding-Relations , но я не уверен, что это сработает для нескольких наборов результатов, так как пример - одна книга для одного автора.Тем не менее, мой сценарий - один участник для нескольких пользователей.

Также (и мне, возможно, понадобится перейти к более прямому подходу), я использую соединительную таблицу, чтобы я мог назначить дополнительные метаданные дляотношения.Итак ... участники> объединенная таблица (содержащая дополнительные данные)> пользователи (и наоборот).Опять же, мне может понадобиться рассмотреть прямую связь между участниками и пользователями, а затем использовать таблицу ParticipantUserMeta для хранения дополнительных метаданных.Однако в данный момент я склоняюсь к таблице соединений, содержащей ассоциацию, а также дополнительные метаданные.

Вот основы моих сущностей (большинство ненужных данных опущено):

Пользователь:

/**
 * @ApiResource
 * ...
 */
class User implements UserInterface, \Serializable
{
    /**
     * @var int
     *
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @var string
     * @ORM\Column(type="string")
     * @Assert\NotBlank()
     */
    private $name = '';

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\ParticipantRel", mappedBy="user")
     */
    private $participants;

    public function __construct()
    {
        $this->participants = new ArrayCollection();
    }

    public function getId(): int
    {
        return $this->id;
    }

    public function getName(): string
    {
        return $this->name;
    }

    /**
     * @return Collection|ParticipantRel[]
     */
    public function getParticipants(): Collection
    {
        return $this->participants;
    }
}

ParticipantRel:

/**
 * @ApiResource
 * ...
 */
class ParticipantRel
{
    /**
     * @var int The Participant Id
     *
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @var int
     * 
     * @ORM\Column(type="boolean")
     */
    private $primary_contact;

    /**
     * @var string Relationship notes
     * 
     * @ORM\Column(type="text", nullable=true)
     */
    private $notes;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Participants", inversedBy="users")
     * @ORM\JoinColumn(nullable=false)
     */
    private $participant;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\User", inversedBy="participants")
     * @ORM\JoinColumn(nullable=false)
     */
    private $user;

    public function getId (): int
    {
        return $this->id;
    }

    public function getPrimaryContact(): ?bool
    {
        return $this->primary_contact;
    }

    public function getNotes(): ?string
    {
        return $this->notes;
    }

    public function getParticipant(): ?Participants
    {
        return $this->participant;
    }

    public function getUser(): ?User
    {
        return $this->user;
    }
}

Участники

/**
 * @ApiResource
 * ...
 */
class Participants
{
    /**
     * @var int The Participant Id
     *
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @var string Participant's first name
     * 
     * @ORM\Column(name="name")
     * @Assert\NotBlank
     */
    public $name;

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\ParticipantRel", mappedBy="participant")
     */
    private $users;

    public function __construct() {
        $this->users = new ArrayCollection();
    }

    public function getId (): int
    {
        return $this->id;
    }

    public function getName(): ?string
    {
        return $this->name;
    }

    /**
     * @return Collection|ParticipantRel[]
     */
    public function getUsers(): Collection
    {
        return $this->users;
    }
}

Мой вопрос: возможно ли то, что я пытаюсь сделать внутри организации, и если да, то чтоя скучаю?Я много исследовал это, прежде чем приехать сюда, но не нашел никакого решения, так как большинство решений, которые я вижу, включают в себя Twig tpl, но я просто отправляю данные через api-платформу.Любое положительное направление будет с благодарностью.

1 Ответ

0 голосов
/ 18 ноября 2018

Итак, получается, что мне просто нужно было поэкспериментировать с опцией групп (https://api -platform.com / docs / core / serialization # embedding-Relations ). Связывание всех связанных полей с относительными группами на всех относительных единицах привело к тому, что результаты вернулись в нужном формате.

...