Невозможно получить работу ManyToOne ApiSubresource. Ошибка: ожидается StateFieldPathExpression или SingleValuedAssociationField - PullRequest
1 голос
/ 26 апреля 2020

Я начал делать небольшой проект на платформе API, чтобы проверить, как он работает.

К сожалению, в самом начале я столкнулся с проблемой, что не могу установить отношение @ApiSubresource ManyToOne, потому что оно выбрасывает ошибка

"[Семантическая ошибка] строка 0, столбец 129 рядом с 'users =: cur': Ошибка: недопустимое выражение PathExpression. Ожидается StateFieldPathExpression или SingleValuedAssociationField."

My классы выглядят так:

/**
 * @ApiResource(
 *     collectionOperations={"post"},
 *     itemOperations={
 *     "get"={ "security"="is_granted('VIEW_AS_OWNER_USER', object)", }
 *     },
 *     normalizationContext={"groups"={"operation:read"}},
 *     denormalizationContext={"groups"={"operation:write"}}
 * )
 * @ORM\Entity(repositoryClass="App\Repository\UserRepository")
 * @ORM\Table(name="`user`")
 */
class User implements UserInterface
{
    /* rest of the entity declaration omitted */
    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Band", inversedBy="users")
     * @ApiSubresource()
     */
    private $band;
}
/**
 * @ApiResource()
 * @ORM\Entity(repositoryClass="App\Repository\BandRepository")
 * @ORM\Table(name="band")
 */
class Band
{
    /* rest of the entity declaration omitted */

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

}

После копания внутри Symfony Parser выглядит так, как будто пытается выполнить это SQL:

SELECT o FROM App \ Entity \ Band o ГДЕ o IN (ВЫБЕРИТЕ IDENTITY (id_a1.band) ИЗ ПРИЛОЖЕНИЯ \ Entity \ User id_a1 ГДЕ id_a1.id =: id_p1) И o.users =: current_user

С этими двумя параметрами : enter image description here

Я нашел несколько советов, но каждый был за Symfony для ручного запроса. Есть какой-то автоматизированный c запрос на построение, по крайней мере для меня, самого базового c уровня.

Вы знаете, что я сделал неправильно? Или это просто сломанные рамки?

1 Ответ

1 голос
/ 26 апреля 2020

Не рекомендуется использовать UUID в качестве первичного ключа. Все сравнения, выполненные вашей базой данных, потребуют больше времени для сравнения строки, чем целого числа, поэтому объединения будут менее эффективными. Вы должны иметь целое число в качестве первичного ключа. UUID используется для того, чтобы кто-то не попробовал URL-адрес, изменив идентификатор и проверив все идентификаторы. Затем вы можете просто использовать uuid в качестве другого свойства. Вам нужно только установить для свойства Api identifier значение true, и API-платформа будет использовать его вместо первичного ключа. Этот совет может решить вашу проблему, но я не уверен.

Я думаю, вам следует подождать, пока команда API-платформы объединит этот pull-запрос

Doctrine использовать последовательность для генерации автоинкрементации. Таким образом, база данных никогда не будет пытаться вставить две записи, имеющие один и тот же ключ автоинкремента. Последовательность была создана, чтобы избежать этой проблемы.

UUID - это небольшая проблема с производительностью, если вы добавляете индекс и ищете только свою сущность с помощью этого uuid. Если вы делаете что-то еще, например, внутреннее соединение с другим объектом, это будет большой проблемой производительности.

...