有2个实体,课程和用户任务。它们分别具有OneToMany关系。出于某种原因,尽管用户将Course和UserTask连接在一起,但是当用户登录并在我的应用程序中执行任务时,该课程ID并未设置为数据库。在这种情况下,将设置所有其他字段,例如userId。并且代码与工作示例完全相同。如果您将课程ID手动保存到数据库中,则可以使用,但是当用户输入某些任务时,我需要使用此课程ID自动设置。告诉我,也许我错过了什么?如您在屏幕截图上所见,我已经填写了所有字段,但courseId为空Database image
这是我的课程实体
/**
* @ORM\OneToMany( targetEntity="UserTask", mappedBy="courses", cascade={"persist"}, orphanRemoval=true )
*/
private $userTask;
public function __construct()
{
$this->userTask = new \Doctrine\Common\Collections\ArrayCollection();
}
/**
* @return ArrayCollection
*/
public function getUserTask()
{
return $this->userTask;
}
/**
* @param mixed $userTask
* @return Courses
*/
public function setUserTask($userTask)
{
if (count($userTask) > 0) {
foreach ($userTask as $i) {
$this->addUserTask($i);
}
}
return $this;
}
/**
* @param UserTask $userTask
*/
public function addUserTask(UserTask $userTask)
{
$userTask->setCourses($this);
$this->userTask->add($userTask);
}
/**
* @param UserTask $userTask
*/
public function removeUserTask(UserTask $userTask)
{
$this->userTask->removeElement($userTask);
}
这是我的UserTasks实体
/**
* @ORM\ManyToOne(targetEntity="Courses", inversedBy="userTask")
*/
private $courses;
/**
* @param Courses $courses
* @return UserTask
*/
public function setCourses(Courses $courses)
{
$this->courses = $courses;
return $this;
}
/**
* @return Courses
*/
public function getCourses(): ?Courses
{
return $this->courses;
}
我的控制器
/**
* @Rest\Get("/v2/courses", name="show_all_courses")
* @param CoursesRepository $coursesRepository
* @param UserTaskRepository $userTaskRepository
* @param TaskRepository $taskRepository
* @return Response
*/
public function showAllCourses(
CoursesRepository $coursesRepository,
UserTaskRepository $userTaskRepository,
TaskRepository $taskRepository
)
{
/** @var \App\Entity\User $user */
$user = $this->getUser();
$courses = $coursesRepository->findAll();
$total = $taskRepository->count(['courses' => $courses]);
$userTasks = $userTaskRepository->count(['status' => UserTask::SUCCESS, 'user' => $user, 'courses' => $courses]);
if ($total && $userTasks) {
$calculation = ceil(100.0 / $total * $userTasks);
}
$coursesResult = [];
foreach ($courses as $course) {
$coursesResult[] = [
"id" => $course->getId(),
"title" => $course->getTitle(),
"description" => $course->getDescription(),
"progress" => $calculation ?? 0
];
}
return $this->handleView($this->view($coursesResult));
}
您以错误的方式使用@ORM\OneToMany
和@ORM\ManyToOne
批注:
class Course { // For consistency i would use singular for ALL entities...
/**
* @ORM\ManyToOne(targetEntity=UserTask::class, inversedBy="courses")
*/
private $userTask; // Here i use a class reference 'UserTask::class' instead of a string 'UserTask'.
...
}
class UserTask {
/**
* @ORM\OneToMany(targetEntity=Course::class, mappedBy="userTask", cascade={"persist"}, orphanRemoval=true)
*/
private $courses;
...
}
为了提醒您,如果属性应该是单个Entity对象,则将需要ToOne
批注。如果该属性是集合,则将需要ToMany
注释。
还请注意,mappedBy
中的OneToMany
引用应为单个Entity对象的属性,而inversedBy
中的ManyToOne
应为集合属性。