Ошибка сохранения объекта в базе данных

У меня такая ошибка:

Expected argument of type "integer or null", "App\Entity\User" given

чего я не понимаю, ну я понимаю ошибку, но я не уверен, почему она возникает.

Вот мой файл AddController.php:

<?php
    namespace App\Controller\Tag;

    use App\Entity\Tag;
    use App\Form\Tag\AddType;
    use Symfony\Bundle\FrameworkBundle\Controller\Controller;
    use Symfony\Component\Config\Definition\Exception\Exception;
    use Symfony\Component\HttpFoundation\Request;

    class AddController extends Controller
    {
        public function add(Request $request)
        {
            $tag  = new Tag();
            $form = $this->createForm(AddType::class, $tag);

            $form->handleRequest($request);

            if ($form->isSubmitted() && $form->isValid()) {
                $entityManager = $this->getDoctrine()->getManager();

                $pageInfo = $form->getData();

                $description = $pageInfo['description'];
                $name        = $pageInfo['name'];
                $guru        = $pageInfo['guru_id'];
                $createdTs   = new \DateTime();

                $tag->setApproved(false);
                $tag->setDescription($description);
                $tag->setName($name);
                $tag->setGuruId((is_int($guru) ? $guru : null));
                $tag->setCreatedTs($createdTs);

                try {
                    $entityManager->persist($tag);
                    $entityManager->flush();

                    $this->addFlash('success', 'Tag Submitted for review! '. $guru);
                } catch (Exception $e) {
                    $this->addFlash('danger', 'Something went skew-if. Please try again.');
                }

                return $this->redirectToRoute('tag_add');
            }

            return $this->render('tag/add.html.twig', array('form' => $form->createView()));
        }
    }

начальная загрузка работает, но при отправке формы возникает указанная выше ошибка. Но я не знаю почему. Даже если я переупорядочу свои строки вот так:

$tag  = new Tag();
$tag->setGuruId(null);

моя сущность тега:

<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass = "App\Repository\TagRepository")
 */
class Tag
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type = "integer")
     */
    private $id;

    /**
     * @ORM\Column(type = "string", length=125)
     */
    private $name;

    /**
     * @ORM\Column(type = "string", length=255, nullable=true)
     */
    private $description;

    /**
     * @ORM\Column(type = "boolean")
     */
    private $approved;

    /**
     * @ORM\Column(type = "datetime")
     */
    private $created_ts;

    /**
     * @ORM\Column(type = "datetime", nullable=true)
     */
    private $last_edit_ts;

    /**
     * @ORM\Column(type = "integer", nullable=true)
     */
    private $guru_id;

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

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

    public function setName(string $name): self
    {
        $this->name = $name;

        return $this;
    }

    public function getDescription(): ?string
    {
        return $this->description;
    }

    public function setDescription(?string $description): self
    {
        $this->description = $description;

        return $this;
    }

    public function getApproved(): ?bool
    {
        return $this->approved;
    }

    public function setApproved(bool $approved): self
    {
        $this->approved = $approved;

        return $this;
    }

    public function getCreatedTs(): ?\DateTimeInterface
    {
        return $this->created_ts;
    }

    public function setCreatedTs(\DateTimeInterface $created_ts): self
    {
        $this->created_ts = $created_ts;

        return $this;
    }

    public function getLastEditTs(): ?\DateTimeInterface
    {
        return $this->last_edit_ts;
    }

    public function setLastEditTs(\DateTimeInterface $last_edit_ts): self
    {
        $this->last_edit_ts = $last_edit_ts;

        return $this;
    }

    public function getGuruId(): ?int
    {
        return $this->guru_id;
    }

    public function setGuruId(?int $guru_id): self
    {
        $this->guru_id = $guru_id;

        return $this;
    }
}

мой AddType

use App\Entity\Tag;
use App\Entity\User;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class AddType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('name', TextType::class)
            ->add('description', TextareaType::class)
            ->add('guru_id', EntityType::class, array(
                'class' => User::class,
                'choice_label' => 'username'
            ));
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => Tag::class
        ));
    }
}

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

Спасибо

Не могли бы вы связать свой вопрос с вашей сущностью Tag. Я думаю, вы неправильно используете отображение Doctrine

Mcsky 29.05.2018 17:29

@Mcsky, мой make:entity был автоматически сгенерирован - все еще нужен код или ..?

treyBake 29.05.2018 17:30

Пойдите для кода да

Mcsky 29.05.2018 17:30

@Mcsky см. Обновленный вопрос

treyBake 29.05.2018 17:39

guru - это одна из ваших таблиц, связанных с tag? Если да, то это проблема сопоставления с доктриной. Пишу ответ

Mcsky 29.05.2018 17:44

@Mcsky нет .. это просто название поля

treyBake 29.05.2018 17:46

Позвольте нам продолжить обсуждение в чате.

Mcsky 29.05.2018 17:48

Не могли бы вы скопировать полное сообщение об ошибке? Пользователь нигде не отображается в вашем коде, не могли бы вы добавить код для AddType, пожалуйста?

Preciel 29.05.2018 18:12

@preciel - это полная ошибка. И я знаю, поэтому я запутался, ха-ха

treyBake 29.05.2018 18:25

@ThisGuyHasTwoThumbs, пожалуйста, обновите вопрос с помощью класса формы AddType, чтобы знать, как вы его объявляете, я подозреваю, что проблема там ...

yceruto 29.05.2018 18:31
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
0
10
1 097
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вероятно, у вас есть поле EntityType в форме AddType для обработки свойства guru_id, и оно автоматически отображает отправленное значение (экземпляр User) с помощью метода setGuruId(?int $guru_id). Вот почему это:

Expected argument of type "integer or null", "App\Entity\User" given

У вас есть несколько вариантов, чтобы исправить это, но, вероятно, лучший из них - изменить сопоставление guru_id на взаимосвязь ManyToOne с User:

// Tag entity

/**
 * @ORM\ManyToOne(targetEntity = "App\Entity\User")
 */
private $guru;

public function getGuru(): ?User
{
    return $this->guru;
}

public function setGuru(?User $guru): self
{
    $this->guru = $guru;

    return $this;
}

Кроме того, я бы удалил этот код:

$tag->setDescription($description);
$tag->setName($name);
$tag->setGuruId((is_int($guru) ? $guru : null));

поскольку эта процедура уже выполняется компонентом Form после отправки данных.


В качестве быстрого обходного пути вы можете исправить это, удалив подсказку типа:

public function setGuruId($guru_id): self
{
    $this->guru_id = $guru_id instanceof User ? $guru_id->getId() : $guru_id;

    return $this;
}
guru не является ключом User, между ними нет никакой связи. Как вы можете видеть в сущности, guru - это простое поле типа integer.
Preciel 29.05.2018 18:05

Я ... Но пока нет намеков на то, что guru получает идентификатор пользователя. Следует сначала запросить содержимое формы и полное сообщение об ошибке ... OP, возможно, пропустил что-то еще.

Preciel 29.05.2018 18:14

@Preciel, это, вероятно, это ^^^ гуру не является пользователем, но он регулируется ...

treyBake 30.05.2018 10:04

это было действительно так :) ты :)

treyBake 30.05.2018 10:50

Другие вопросы по теме