Bạn thường muốn lọc bộ sưu tập khi bạn đang cập nhật một thực thể, chứ không phải có một thực thể mới, phải không?
Đây là một giải pháp làm việc, đây là một ví dụ từ bộ điều khiển (CRUD):
public function updateAction($id)
{
$service = $this->getServiceRepository()->loadOne('id', $id);
$this->checkPermission($service);
$this->filterInventoryByPrimaryLocation($service);
if($this->getFormHandler()->process('service_repair_service', $service, array('type' => 'update')))
{
$this->getEntityManager()->process('persist', $service);
return $this->render('ServiceRepairBundle:Service:form_message.html.twig', [
'message' => $this->trans('Service has been updated successfully.')
]);
}
return $this->render('ServiceRepairBundle:Service:form.html.twig', [
'form' => $this->getFormHandler()->getForm()->createView(),
]);
}
private function filterInventoryByPrimaryLocation(Service $service)
{
$inventory = $service->getInventory();
$criteria = Criteria::create()
->where(Criteria::expr()->eq('location', $this->getUser()->getPrimaryLocation()))
->orderBy(array('timeInsert' => Criteria::ASC));
$service->setInventory($inventory->matching($criteria));
}
$ dịch vụ = ENTITY, $ hàng tồn kho = ArrayCollection ($ dịch vụ-> getInventory())
Chìa khóa ở đây là sử dụng tiêu chuẩn Học thuyết của, biết thêm ở đây:
http://doctrine-orm.readthedocs.org/en/latest/reference/working-with-associations.html#filtering-collections
Cũng nghĩ về cách di chuyển Tiêu chí trong thực thể, tạo một phương thức công khai ở đó. Khi bạn tải nó từ cơ sở dữ liệu, bạn có thể kích hoạt phương thức đó bằng cách sử dụng gọi lại vòng đời postLoad của doctrine. Ofcourse đặt nó trong thực thể sẽ làm việc, nếu bạn không yêu cầu bất kỳ dịch vụ hoặc những thứ như thế.
Một giải pháp khác có thể là, để di chuyển tiêu chí trong một sự kiện biểu mẫu bên trong lớp biểu mẫu, nếu bạn chỉ cần lọc bên trong biểu mẫu.
Nếu bạn cần bộ lọc thu thập được thực hiện một cách minh bạch trong toàn bộ dự án, hãy viết một người nghe học thuyết và đặt mã bên trong một phương thức postLoad(). Bạn cũng có thể tiêm phụ thuộc vào người nghe học thuyết, nhưng tôi khuyên bạn nên tiêm container chính nó, vì lười tải các dịch vụ khác, vì vậy bạn không nhận được tài liệu tham khảo dịch vụ tròn.
Chúc may mắn!
Bạn muốn làm gì? Sử dụng một loại tùy chỉnh với 'query_builder'? Nếu vậy, bạn có thể dán mã 'UserTaskType' không? – Florent
Loại UserTask chỉ có một trường được gọi là 'tên'. Tôi đang tải bộ sưu tập của usertasks trên biểu mẫu. Nó hoạt động tốt. Nhưng tôi chỉ muốn một số nhiệm vụ được lọc như 'tất cả các nhiệm vụ trong đó trạng thái = 1' không phải tất cả các tác vụ được liên kết với người dùng – user825904