두 엔티티가 있습니다. 작업 및 부서.맞춤 교리 저장소를 심포니에 매핑 된 엔티티에 어떻게 연결시킬 수 있습니까?
하나의 부서는 많은 작업을 수행 할 수 있습니다.
/**
* @ORM\Entity
* @ORM\Table(name="departments")
*/
class Department
{
/**
* @ORM\OneToMany(targetEntity="Task", mappedBy="department")
*/
public $tasks;
/**
* @return ArrayCollection|Task[]
*/
public function getTasks()
{
return $this->tasks;
}
}
.
/**
* @ORM\Entity
* @ORM\Table(name="tasks")
*/
class Task
{
/**
* @ORM\ManyToOne(targetEntity="Department", inversedBy="tasks")
*/
public $department;
/**
* @return Department
*/
public function getDepartment()
{
return $this->department;
}
}
또한 모든 부서 및 관련 작업을 보여주는보기가 있습니다.
{% for department in departments %}
{% for task in department.tasks %}
...
{% endfor %}
{% endfor %}
그러면 작업이 채워진 몇 개의 열이 표시됩니다.
각 열에 기한순으로 주문되는 가장 임박한 작업 만 표시되도록 변경하려고합니다. 나는 사용자 지정 쿼리로 TaskRepository
클래스를 만든이를 위해
:이 페이지는 하나 개의 부서 인 경우
class TaskRepository extends EntityRepository
{
/**
* @param Department $department
* @return Task[]
*/
public function findAllRecentTasksForGenus(Department $department)
{
return $this->createQueryBuilder('task')
->andWhere('task.department = :department')
->setParameter('department', $department)
->andWhere('task.dueDate> :dueDate')
->setParameter('dueDate', new \DateTime('-1 week'))
->orderBy('task.dueDate', 'DESC')
->getQuery()
->execute();
}
}
지금, 나는 단순히 내 컨트롤러에 사용자 지정 쿼리를 부를 것이다, 그리고 당겨 보기로
그러나 모든 임박한 작업으로 모든 부서를 보여주고 있다는 사실로 인해 부서와 업무의 배열을 구축해야하기 때문에 컨트롤러에서 조금 조잡합니다.
현재로서는 나뭇 가지에 department.tasks
이상의 루프가 필요하고 부서 엔티티와 관련된 작업을 가져 오는 것을 알고 있기 때문에 추한 느낌입니다.
또한 내 부서 엔티티의 리포지토리에서 사용자 지정 쿼리를 호출하면 안된다는 것을 알고 있습니다.
그래서 내가 알아 내려고하는 것은 - 관련 엔터티에 설명 된 맞춤식 쿼리를 어떻게 든 바인딩 할 수 있습니다. 따라서 Doctrine은 부서에서 작업을 요청할 때 정의 된 것 이외에는 모두 가져와야한다는 것을 알고 있습니다. 하위 집합?
은 이상적으로는 컨트롤러에 추가 로직의 부하를 추가 할 필요없이 (또는 다른 곳에서 그 문제에 tasksDueSoon
같은 뭔가를 호출하여 아래와 같이 나뭇 가지 템플릿을 끝낼 우회 할 수 있도록하고 싶습니다.
{% for department in departments %}
{% for task in department.tasksDueSoon %}
...
{% endfor %}
{% endfor %}
그럴 수 없다면 컨트롤러를 통해 사용자 지정 배열 경로를 따라 가야합니다. 물론 잘못된 것 같습니다.하지만 Syomfony에서이 작업을 수행하고 Department 엔터티에 사용하도록 더 좋은 방법이 있기를 바랍니다. 작업 저장소 또는 무언가.
검색어를 부서 저장소로 이동하고 findDepartmentsWithRecentTasks와 같은 이름을 지정하십시오. select 절에서 'task'를 추가하십시오. 이제 부서를 쿼리하면 최근 작업 만 포함됩니다. 잔가지 템플릿을 변경할 필요가 없습니다. – Cerad
@Cerad - 기본적으로 내가 찾고있는 것이지만 조용하게 작동시킬 수는 없습니다. 샘플 코드와 함께 답변을 추가 하시겠습니까? – Bananaapple