Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用Symfony 3访问多对一关系的用户分数_Php_Symfony_Symfony 3.2 - Fatal编程技术网

Php 使用Symfony 3访问多对一关系的用户分数

Php 使用Symfony 3访问多对一关系的用户分数,php,symfony,symfony-3.2,Php,Symfony,Symfony 3.2,我正在创建一个应用程序,根据用户解决的问题在数据库中保存用户分数。我有用户、问题和提交实体。对于所有这些,我都与用户实体有一对多的关系。问题实体具有保存问题分数的point字段。我正在尝试检索所有用户的总分 这是我的控制器 $userService = $this->container->get('userservice'); $users = $userService->findAll(); foreach ($users as $user){ $us

我正在创建一个应用程序,根据用户解决的问题在数据库中保存用户分数。我有用户、问题和提交实体。对于所有这些,我都与用户实体有一对多的关系。问题实体具有保存问题分数的point字段。我正在尝试检索所有用户的总分

这是我的控制器

 $userService = $this->container->get('userservice');
 $users = $userService->findAll();
  foreach ($users as $user){
        $usersWPoints = $user->getSubmissions()->getProblemId()->getPoints;
    }
但是,这将返回以下错误:

Attempted to call an undefined method named "getProblemId" of class "Doctrine\ORM\PersistentCollection".
这是我的模型

User.php

/**
* Class User
* @package AppBundle\Entity
* @ORM\Entity(repositoryClass="AppBundle\Repository\UserRepository")
* @ORM\Table(name="user")
* @ORM\HasLifecycleCallbacks()
* @UniqueEntity(fields="username", message="Email already taken")
*
*/
class User implements UserInterface
{

/**
 * @ORM\Id
 * @ORM\Column(type="integer")
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;


/**
 * @ORM\Column(type="string", length=255, unique=true)
 * @Assert\NotBlank(message="Please enter a valid email address")
 * @Assert\Email()
 */
private $username;

/**
 * @ORM\Column(type="string", length=255, unique=true)
 * @Assert\NotBlank(message="Please enter a valid email address")
 */
private $usrname;

/**
 * @Assert\NotBlank()
 * @Assert\Length(max=4096)
 */
private $plainPassword;

/**
 * The below length depends on the "algorithm" you use for encoding
 * the password, but this works well with bcrypt.
 *
 * @ORM\Column(type="string", length=64)
 */
private $password;

/**
 * @ORM\Column(type="string", length=255, unique=true)
 * @Assert\NotBlank(message="Please enter a valid name")
 */
private $fullname;

/**
 * @var array
 * @ORM\Column(name="roles", type="json_array")
 */
protected $roles;

/**
 * @ORM\OneToMany(targetEntity="AppBundle\Entity\Problem", mappedBy="createdby")
 */
protected $problems;

/**
 * @ORM\OneToMany(targetEntity="AppBundle\Entity\Feed", mappedBy="createdby")
 */
protected $feeds;


/**
 * @ORM\OneToMany(targetEntity="AppBundle\Entity\Comment", mappedBy="createdby")
 */
protected $comments;

/**
 * @ORM\OneToMany(targetEntity="AppBundle\Entity\Submission", mappedBy="user_id")
 */
protected $submissions;


// other properties and methods

public function getUsername()
{
    return $this->username;
}

public function setUsername($username)
{
    $this->username = $username;
}

public function getPlainPassword()
{
    return $this->plainPassword;
}

public function setPlainPassword($password)
{
    $this->plainPassword = $password;
}

public function getPassword()
{
    return $this->password;
}

public function setPassword($password)
{
    $this->password = $password;
}

public function getSalt()
{
    // The bcrypt algorithm doesn't require a separate salt.
    // You *may* need a real salt if you choose a different encoder.
    return null;
}

// other methods, including security methods like getRoles()

/**
 * @return array
 */
public function getRoles()
{
    return $this->roles;
}

public function setRoles(array $roles){
    $this->roles = $roles;
    return $this;
}

/**
 * @return mixed
 */
public function getFullname()
{
    return $this->fullname;
}

/**
 * @param mixed $fullname
 */
public function setFullname($fullname)
{
    $this->fullname = $fullname;
}

/**
 * @return mixed
 */
public function getUsrname()
{
    return $this->usrname;
}

/**
 * @param mixed $usrname
 */
public function setUsrname($usrname)
{
    $this->usrname = $usrname;
}


/**
 * Removes sensitive data from the user.
 *
 * This is important if, at any given point, sensitive information like
 * the plain-text password is stored on this object.
 */
public function eraseCredentials()
{
}

/**
 * @return mixed
 */
public function getId()
{
    return $this->id;
}

/**
 * @return \Doctrine\Common\Collections\Collection
 */
public function getSubmissions()
{
    return $this->submissions;
}
Problem.php

/**
 * Class Problem
 * @package AppBundle\Entity
 * @ORM\Entity(repositoryClass="AppBundle\Repository\ProblemRepository")
 * @ORM\Table(name="problem")
 * @ORM\HasLifecycleCallbacks()
 *
 */
class Problem
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=255, unique=True)
     * @Assert\NotBlank(message="Please enter a valid title")
     */
    protected $title;

    /**
     * @ORM\Column(type="string")
     * @Assert\NotBlank(message="Please enter a valid description")
     */
    protected $description;

    /**
     * @ORM\Column(type="string")
     * @Assert\NotBlank(message="Please enter a valid value")
     */
    protected $points;

    /**
     * @ORM\Column(type="string")
     * @Assert\NotBlank(message="Please enter a valid flag")
     */
    protected $flag;

    /**
     * @ORM\Column(type="string")
     * @Assert\NotBlank(message="Please enter a valid value")
     */
    protected $category;

    /**
     * @ORM\ManyToOne(targetEntity="AppBundle\Entity\User", inversedBy="problems")
     * @ORM\JoinColumn(name="createdby", referencedColumnName="id")
     */
    protected $createdby;

    /**
     * @ORM\OneToMany(targetEntity="AppBundle\Entity\Submission", mappedBy="problem_id")
     */
    protected $submissions;

    /**
     * @Gedmo\Slug(fields={"title"})
     * @ORM\Column(type="string", length=255, unique=false,)
     */
    protected $slug;


    /**
     * @return mixed
     */
    public function getTitle()
    {
        return $this->title;
    }

    /**
     * @param mixed $title
     */
    public function setTitle($title)
    {
        $this->title = $title;
    }

    /**
     * @return mixed
     */
    public function getDescription()
    {
        return $this->description;
    }

    /**
     * @param mixed $description
     */
    public function setDescription($description)
    {
        $this->description = $description;
    }

    /**
     * @return mixed
     */
    public function getPoints()
    {
        return $this->points;
    }

    /**
     * @param mixed $points
     */
    public function setPoints($points)
    {
        $this->points = $points;
    }

    /**
     * @return mixed
     */
    public function getFlag()
    {
        return $this->flag;
    }

    /**
     * @param mixed $flag
     */
    public function setFlag($flag)
    {
        $this->flag = $flag;
    }

    /**
     * @return mixed
     */
    public function getCategory()
    {
        return $this->category;
    }

    /**
     * @param mixed $category
     */
    public function setCategory($category)
    {
        $this->category = $category;
    }

    /**
     * @return mixed
     */
    public function getCreatedby()
    {
        return $this->createdby;
    }

    /**
     * @param mixed $createdby
     */
    public function setCreatedby($createdby)
    {
        $this->createdby = $createdby;
    }






    /**
     * Get id
     *
     * @return integer
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set slug
     *
     * @param string $slug
     *
     * @return Problem
     */
    public function setSlug($slug)
    {
        $this->slug = $slug;

        return $this;
    }

    /**
     * Get slug
     *
     * @return string
     */
    public function getSlug()
    {
        return $this->slug;
    }

    /**
     * @return mixed
     */
    public function getSubmissions()
    {
        return $this->submissions;
    }

    /**
     * @param mixed $submissions
     */
    public function setSubmissions($submissions)
    {
        $this->submissions = $submissions;
    }    
}
Submission.php

class Submission
{

    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Problem", inversedBy="submissions")
     * @ORM\JoinColumn(name="problem_id", referencedColumnName="id")
     */
    protected $problem_id;

    /**
     * @ORM\Column(type="boolean")
     */
    protected $correct = false;

    /**
     * @ORM\ManyToOne(targetEntity="AppBundle\Entity\User", inversedBy="submissions")
     * @ORM\JoinColumn(name="user_id", referencedColumnName="id")
     */
    protected $user_id;

    /**
     * @ORM\Column(type="string")
     * @Assert\NotBlank(message="Flag cannot be blank")
     */
    protected $submission_flag;

    /**
     * @return mixed
     */
    public function getProblemId()
    {
        return $this->problem_id;
    }

    /**
     * @param mixed $problem_id
     */
    public function setProblemId($problem_id)
    {
        $this->problem_id = $problem_id;
    }

    /**
     * @return mixed
     */
    public function getCorrect()
    {
        return $this->correct;
    }

    /**
     * @param mixed $correct
     */
    public function setCorrect($correct)
    {
        $this->correct = $correct;
    }

    /**
     * @return mixed
     */
    public function getUserId()
    {
        return $this->user_id;
    }

    /**
     * @param mixed $user_id
     */
    public function setUserId($user_id)
    {
        $this->user_id = $user_id;
    }

    /**
     * @return mixed
     */
    public function getSubmissionFlag()
    {
        return $this->submission_flag;
    }

    /**
     * @param mixed $submission_flag
     */
    public function setSubmissionFlag($submission_flag)
    {
    $this->submission_flag = $submission_flag;
}
}

任何关于访问每个用户及其总分的建议都将不胜感激

getSubmissions()返回集合,getProblemId()是提交方法。 所以,一旦您为每个用户提交了许多内容,我就会为用户创建一些getTotalPoints()方法,您可以在foreach中运行这些方法。 这种方式:

public function getTotalPoints()
{
    $submissions = $this->getSubmissions();
    $points = 0;

    foreach ($submissions as $submission) {
        $points += $submission->getProblemId()->getPoints();
    }

    return $points;
}
getSubmissions()返回collenction,getProblemId()是提交方法。 所以,一旦您为每个用户提交了许多内容,我就会为用户创建一些getTotalPoints()方法,您可以在foreach中运行这些方法。 这种方式:

public function getTotalPoints()
{
    $submissions = $this->getSubmissions();
    $points = 0;

    foreach ($submissions as $submission) {
        $points += $submission->getProblemId()->getPoints();
    }

    return $points;
}

你可以这样做:

$userService = $this->container->get('userservice');
$users = $userService->findAll();

$pointPerUser = array();
foreach ($users as $user){
        $userSubmissions = $user->getSubmissions();
        $pointPerUser[$user->getId()] = 0;
        foreach ($userSubmissions as $userSubmission) {
            // Probably here you want to check if the submission is correct
            $pointPerUser[$user->getId()] += $userSubmission->getProblemId()->getPoints();
        } 
}

顺便说一句,submission属性不应该是$PROMIBLE\u id,而应该是$PROMIBLE,方法是getProblem(),因为您得到的是一个问题实例,而不是一个id。表的字段名是可以的,因为您正在存储一个id。

您可以这样做:

$userService = $this->container->get('userservice');
$users = $userService->findAll();

$pointPerUser = array();
foreach ($users as $user){
        $userSubmissions = $user->getSubmissions();
        $pointPerUser[$user->getId()] = 0;
        foreach ($userSubmissions as $userSubmission) {
            // Probably here you want to check if the submission is correct
            $pointPerUser[$user->getId()] += $userSubmission->getProblemId()->getPoints();
        } 
}

顺便说一下,submission属性不应该是$problem\u id,而应该是$problem,方法是getProblem(),因为您得到的是一个问题实例,而不是一个id。在存储id时,表的字段名是可以的。

因为您使用的是
ArrayCollection
可能会考虑使用集合的
map()
函数。在此基础上,提供一个闭包作为
map()
的参数,以汇总每个用户的分数。如果我有时间,我可以试着写一个解决方案。由于您使用的是
ArrayCollection
,因此可能会考虑使用集合的
map()
函数。在此基础上,提供一个闭包作为
map()
的参数,以汇总每个用户的分数。如果我有时间,我可以试着写一个解决方案。嗯。但这将是提交表中所有分数的总和。我需要每个用户的总分。否。这是用户实体的getTotalPoints()。因此,通过在用户实体内运行$this->getSubmissions(),您将获得该特定用户的总分。当然,嗯。但这将汇总提交表中的所有点。我需要每个用户的总分。否。这是用户实体的getTotalPoints()。因此,通过在用户实体内运行$this->getSubmissions(),您将获得该特定用户的总分。为了确保你是对的,我将该方法重命名为getProblem(),将提交属性重命名为$problem。你是对的,我将该方法重命名为getProblem(),将提交属性重命名为$problem。