PHP Symfony4 DoctrineORM OneToMany

问题描述 投票:0回答:1

有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));
    }
php symfony entity symfony4 one-to-many
1个回答
0
投票

您以错误的方式使用@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应为集合属性。

© www.soinside.com 2019 - 2024. All rights reserved.