Изначально сущность Gut имела поле reaction, содержащее строку. Варианты для reaction были встроены в шаблон. Добавив объект Reaction и изменив Gut формы reaction на EntityType, я теперь мучаюсь с сообщением об ошибке
SQLSTATE[42S22]: Column not found: 1054 Unknown column 't0.reaction' in 'field list'
хотя я переписал сущности Gut и Reaction. Наверное, я потерял из виду лес из-за деревьев. Что не так со следующим?
Таблица MySQL gut: столбец reaction заменен на reaction_id; reaction_id правильно создан; внешний ключ, созданный вручную.
Ошибка возникает с этим методом контроллера:
#[Route('/', name: 'app_gut_index', methods: ['GET'])]
public function index(GutRepository $gutRepository): Response
{
$guts = $gutRepository->findBy([], ['happened' => 'DESC']); // error thrown here
return $this->render('gut/index.html.twig', [
'guts' => $guts,
]);
}
Gut объект:
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column]
private ?int $id = null;
#[ORM\Column(length: 255)]
#[ORM\ManyToOne(targetEntity: Reaction::class)]
#[ORM\JoinColumn(name: 'reaction_id', referencedColumnName: 'id')]
protected $reaction;
#[ORM\Column(length: 255, nullable: true)]
private ?string $description = null;
#[ORM\Column(name: "datetime")]
private ?\DateTime $happened = null;
public function getId(): ?int
{
return $this->id;
}
public function getReaction(): ?Reaction
{
return $this->reaction;
}
public function setReaction(?Reaction $reaction): self
{
$this->reaction = $reaction;
return $this;
}
...
}
Reaction объект:
use App\Entity\Gut;
use App\Repository\ReactionRepository;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
#[ORM\Entity(repositoryClass: ReactionRepository::class)]
class Reaction
{
public function __construct()
{
$this->guts = new ArrayCollection();
}
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column]
private ?int $id = null;
#[ORM\Column(length: 45)]
private ?string $reaction = null;
public function getId(): ?int
{
return $this->id;
}
public function getReaction(): ?string
{
return $this->reaction;
}
public function setReaction(string $reaction): self
{
$this->reaction = $reaction;
return $this;
}
#[ORM\OneToMany(targetEntity: Gut::class, mappedBy: 'reaction')]
private $guts;
/**
* @return Collection|Product[]
*/
public function getGuts(): Collection
{
return $this->guts;
}
public function addGut($gut): self
{
$this->guts[] = $gut;
return $this;
}
public function __toString()
{
return $this->getReaction();
}
}
Ваша схема базы данных не синхронизирована с вашими объектами. В частности, у одного из ваших объектов есть поле, которого на самом деле нет в базе данных. Может быть, вы забыли запустить и/или сгенерировать миграцию?
Схема определенно не синхронизирована. Обновление заменило gut.reaction_id на ...reaction. После обновления столбец gut.reaction пуст, но восстановлен из резервной копии. Ошибка сейчас getReaction(): Return value must be of type ?App\Entity\Reaction, string returned. add() отсутствует.
Что меня смущает, так это то, что я ожидал, что ManyToOne создаст оператор SQL с JOIN в нем. Нравится select g.id, r.reaction, g.description, g.datetime` из кишки g присоединиться к реакции r на r.id = g.reaction порядок по g.datetime asc. Instead, the log shows SELECT t0.id КАК id_1, t0.реакция КАК реакция_2, t0.описание КАК description_3, t0.datetime КАК datetime_4 FROM t0 ORDER BY t0.datetime DESC`.
Ради интереса создайте новую базу данных и запустите доктрину: схема: создать, просто чтобы посмотреть, что вы получите, начав с чистого листа. Может поможет сузить тему. Вы правы, имя столбца базы данных должно быть response_id.
Спасибо за мысль. Я на самом деле попробовал ваше предложение и в итоге не нашел, где. Поскольку это внутренний семейный проект, я просто вернусь к запрограммированным реакциям. Рад, что у меня есть серия коммитов git, которые нужно отменить.




Ваш ресурс $reaction не должен иметь аннотаций ORM\Column и ORM\JoinColumn одновременно.
Из-за этого Doctrine считает, что это обычный столбец, поэтому ищет поле базы данных на основе имени переменной: $reaction -> gut.reaction.
Удалите #[ORM\Column(length: 255)], затем убедитесь, что gut.reaction_id есть в вашей базе данных, и теперь это должно работать.
В качестве небольшого примечания, я не думаю, что вам нужно name: 'reaction_id', referencedColumnName: 'id' в ORM\JoinColumn, потому что Doctrine все равно назовет их автоматически.
Просто не мог отпустить. В конце концов я нашел способ заставить сущности Кишки и Реакции хорошо играть вместе. Что я сделал:
make:entity Gut, чтобы добавить свойство реакции как ManyToOne на реакцию; сделал миграциюgut->getReaction() и т. д.
теперь ведут себя так, как ожидалось - в отношении ManyToOne.
Итак,
bin/console doctrine:schema:update --dump-sqlпоказывает, что все синхронизировано? Можете показать код формы для->add('reaction',...? И, конечно же, вы очистили кеш.