Рассчитать процент в Symfony2

У меня есть два объекта Projects и Tasks с их соответствующими репозиториями.

Я пытаюсь создать функцию, которая будет вычислять totalNumberOfTasks(), totalNumberOfCompletedTasks() и getPercentComplete().

  • totalNumberOfTasks() в основном будет извлекать все данные, относящиеся к конкретному project_id из таблицы задач.
  • totalNumberOfCompletedTasks() будет запрашивать все данные, относящиеся к определенному project_id, но только те, которые помечены как COMPLETED из таблицы задач.
  • getPercentComplete() будет вычислять процент, основанный на функциях totalNumberOfTasks() и totalNumberOfCompletedTasks(), и печатать в файле вида.

Я попытался сделать {{ project.tasks|length }} % в файле Twig, который отобрал только общее количество задач, относящихся к этому конкретному id. Как получить общее количество заданий и завершенных задач, найти процент, затем показать его в файле вида, где отображаются все проекты? Извините за мой английский. Я просто не могу сделать вопрос более понятным.

Project объект:

<!--?php
namespace TaskManagerBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
 * Projects
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="TaskManagerBundle\Entity\Repository\ProjectsRepository")
 * @ORM\HasLifecycleCallbacks()
 */
class Projects
{
 /**
 *
 * @ORM\OneToMany(targetEntity="Tasks", mappedBy="projects")
 */
 protected $tasks;
 /**
 * @var integer
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
 private $id;
 /**
 * @var string
 *
 * @ORM\Column(name="title", type="string", length=30)
 */
 private $title;
 /**
 * @var boolean
 *
 * @ORM\Column(name="completed", type="boolean")
 */
 private $completed;
 /**
 * @var \Date
 *
 * @ORM\Column(name="due_date", type="date")
 */
 private $dueDate;
 /**
 * @var \Date
 *
 * @ORM\Column(name="created", type="date")
 */
 private $created;
 /**
 * @var \Date
 *
 * @ORM\Column(name="updated", type="date")
 */
 private $updated;
 /**
 * Get id
 *
 * @return integer
 */
 public function getId()
 {
 return $this--->id;
 }
 /**
 * Set title
 *
 * @param string $title
 * @return Projects
 */
 public function setTitle($title)
 {
 $this->title = $title;
 return $this;
 }
 /**
 * Get title
 *
 * @return string
 */
 public function getTitle()
 {
 return $this->title;
 }
 /**
 * Set completed
 *
 * @param boolean $completed
 * @return Projects
 */
 public function setCompleted($completed)
 {
 $this->completed = $completed;
 return $this;
 }
 /**
 * Get completed
 *
 * @return boolean
 */
 public function getCompleted()
 {
 return $this->completed;
 }
 /**
 * Set dueDate
 *
 * @param \Date $dueDate
 * @return Projects
 */
 public function setDueDate($dueDate)
 {
 $this->dueDate = $dueDate;
 return $this;
 }
 /**
 * Get dueDate
 *
 * @return \Date
 */
 public function getDueDate()
 {
 return $this->dueDate;
 }
 /**
 * Set created
 *
 * @param \Date $created
 * @return Projects
 */
 public function setCreated($created)
 {
 $this->created = $created;
 return $this;
 }
 /**
 * Get created
 *
 * @return \date
 */
 public function getCreated()
 {
 return $this->created;
 }
 /**
 * Set updated
 *
 * @param \Date $updated
 * @return Projects
 */
 public function setUpdated($updated)
 {
 $this->updated = $updated;
 return $this;
 }
 /**
 * Get updated
 *
 * @return \Date
 */
 public function getUpdated()
 {
 return $this->updated;
 }
 /**
 * @ORM\PrePersist
 */
 public function setCreatedValue()
 {
 $this->created = new \DateTime();
 }
 /**
 * @ORM\PreUpdate
 */
 public function setUpdatedValue()
 {
 $this->updated = new \DateTime();
 }
 public function getNumberOfTasks()
 {
 }
 /**
 * Constructor
 */
 public function __construct()
 {
 $this->tasks = new \Doctrine\Common\Collections\ArrayCollection();
 }
 /**
 * Add tasks
 *
 * @param \TaskManagerBundle\Entity\Tasks $tasks
 * @return Projects
 */
 public function addTask(\TaskManagerBundle\Entity\Tasks $tasks)
 {
 $this->tasks[] = $tasks;
 return $this;
 }
 /**
 * Remove tasks
 *
 * @param \TaskManagerBundle\Entity\Tasks $tasks
 */
 public function removeTask(\TaskManagerBundle\Entity\Tasks $tasks)
 {
 $this->tasks->removeElement($tasks);
 }
 /**
 * Get tasks
 *
 * @return \Doctrine\Common\Collections\Collection
 */
 public function getTasks()
 {
 return $this->tasks;
 }
}

Tasks entity:

namespace TaskManagerBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
 * Tasks
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="TaskManagerBundle\Entity\Repository\TasksRepository")
 * @ORM\HasLifecycleCallbacks()
 */
class Tasks
{
 /**
 *
 * @ORM\ManyToOne(targetEntity="Projects", inversedBy="tasks")
 * @ORM\JoinColumn(name="projects_id", referencedColumnName="id")
 */
 protected $projects;
 /**
 * @var integer
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
 private $id;
 /**
 * @var string
 *
 * @ORM\Column(name="title", type="string", length=30)
 */
 private $title;
 /**
 * @var string
 *
 * @ORM\Column(name="description", type="text")
 */
 private $description;
 /**
 * @var \DateTime
 *
 * @ORM\Column(name="updated", type="date")
 */
 private $updated;
 /**
 * @var \DateTime
 *
 * @ORM\Column(name="created", type="date")
 */
 private $created;
 /**
 * @var \DateTime
 *
 * @ORM\Column(name="due_date", type="date")
 */
 private $dueDate;
 /**
 * @var boolean
 *
 * @ORM\Column(name="completed", type="boolean")
 */
 private $completed;
 /**
 * Get id
 *
 * @return integer
 */
 public function getId()
 {
 return $this->id;
 }
 /**
 * Set title
 *
 * @param string $title
 * @return Tasks
 */
 public function setTitle($title)
 {
 $this->title = $title;
 return $this;
 }
 /**
 * Get title
 *
 * @return string
 */
 public function getTitle()
 {
 return $this->title;
 }
 /**
 * Set description
 *
 * @param string $description
 * @return Tasks
 */
 public function setDescription($description)
 {
 $this->description = $description;
 return $this;
 }
 /**
 * Get description
 *
 * @return string
 */
 public function getDescription()
 {
 return $this->description;
 }
 /**
 * Set updated
 *
 * @param \DateTime $updated
 * @return Tasks
 */
 public function setUpdated($updated)
 {
 $this->updated = $updated;
 return $this;
 }
 /**
 * Get updated
 *
 * @return \DateTime
 */
 public function getUpdated()
 {
 return $this->updated;
 }
 /**
 * Set created
 *
 * @param \DateTime $created
 * @return Tasks
 */
 public function setCreated($created)
 {
 $this->created = $created;
 return $this;
 }
 /**
 * Get created
 *
 * @return \DateTime
 */
 public function getCreated()
 {
 return $this->created;
 }
 /**
 * Set dueDate
 *
 * @param \DateTime $dueDate
 * @return Tasks
 */
 public function setDueDate($dueDate)
 {
 $this->dueDate = $dueDate;
 return $this;
 }
 /**
 * Get dueDate
 *
 * @return \DateTime
 */
 public function getDueDate()
 {
 return $this->dueDate;
 }
 /**
 * Set completed
 *
 * @param boolean $completed
 * @return Tasks
 */
 public function setCompleted($completed)
 {
 $this->completed = $completed;
 return $this;
 }
 /**
 * Get completed
 *
 * @return boolean
 */
 public function getCompleted()
 {
 return $this->completed;
 }
 /**
 * Set projects
 *
 * @param \TaskManagerBundle\Entity\Projects $projects
 * @return Tasks
 */
 public function setProjects(\TaskManagerBundle\Entity\Projects $projects = null)
 {
 $this->projects = $projects;
 return $this;
 }
 /**
 * Get projects
 *
 * @return \TaskManagerBundle\Entity\Projects
 */
 public function getProjects()
 {
 return $this->projects;
 }
}

Контроллер:

<!--?php
namespace TaskManagerBundle\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use TaskManagerBundle\Entity\Projects;
use TaskManagerBundle\Form\ProjectType;
class DefaultController extends Controller
{
 public function indexAction()
 {
 $em = $this--->getDoctrine()->getManager();
 $entities = $em->getRepository('TestBundle:Projects')->findAll();
 return $this->render('TestBundle:Default:index.html.twig', 'projects' => $entities]);
 }
}
1 ответ

вы можете архивировать эту проблему, используя "Критерии доктрины" вместо создания настраиваемого метода репозитория. В качестве примера вы можете добавить следующий класс в класс "Объекты проектов":

use Doctrine\Common\Collections\Criteria; // IMPORT THIS!
use Doctrine\ORM\Mapping as ORM;
/**
 * Projects
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="TaskManagerBundle\Entity\Repository\ProjectsRepository")
 * @ORM\HasLifecycleCallbacks()
 */
class Projects
{
 ...
 public function getCompleteTasks()
 {
 $expr = Criteria::expr();
 $criteria = Criteria::create();
 $criteria->where($expr->eq('completed', true));
 return $this->getTasks()->matching($criteria);
 }
 public function getNumberOfTasks()
 {
 return $this->getTasks()->count();
 }
 public function getPercentComplete()
 {
 $percentage = 0;
 $totalSize = $this->getNumberOfTasks();
 if ($totalSize>0)
 {
 $completedSize = $this->getCompleteTasks()->count();
 $percentage = $completedSize / $totalSize * 100;
 }
 return $percentage;
 }
...
}

Затем вы можете использовать в своем шаблоне Twig, как показано ниже:

{{ project.percentComplete|number_format(2, '.', ',') }}

Надеюсь на эту помощь.

licensed under cc by-sa 3.0 with attribution.