2012-08-03 3 views
13

IN AcmePizza Bundle này đang làm việc tốttôi có thể sử dụng truy vấn theo hình thức xây dựng để lọc bộ sưu tập dưới dạng symfony

->add('pizza', 'entity', array(
       'class'   => 'Acme\PizzaBundle\Entity\Pizza', 
       'query_builder' => function ($repository) { return $repository->createQueryBuilder('p')->orderBy('p.name', 'ASC'); }, 
      )) 

tôi có thể làm điều gì đó như thế trong bộ sưu tập

->add('userTasks','collection',array('type' => new UserTaskType(), 
        'class'   => 'acme\myBundle\Entity\UserTask', 
        'query_builder' => function ($repository) { return $repository->createQueryBuilder('p')->orderBy('p.name', 'ASC'); }, 
       )) 
+0

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

+0

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

Trả lời

-2

Yes.

Trong lớp UserTaskType của bạn, hãy thêm phương thức sau đây.

public function getDefaultOptions(array $options) 
{ 
    return array(
     'data_class' => 'acme\myBundle\Entity\UserTask', 
     'query_builder' => function($repo) { 
      return $repo->createQueryBuilder('p')->orderBy('p.name', 'ASC'); 
     } 
    ); 
} 
+1

tôi đã thử rằng không có gì xảy ra. Tôi có cần phải có lớp repo cho điều đó không. tôi thậm chí đã có lỗi trên tên trường nhưng nó vẫn không hiển thị bất kỳ lỗi nào cho điều đó. Có vẻ như người xây dựng queru đó không hoạt động ở tất cả – user825904

+1

Tương tự ở đây. Tôi thực sự thực sự muốn rằng để làm việc nhưng tiếc là nó không cho một số lý do: ( –

+1

Nó không hoạt động. Trước hết bạn đang sử dụng một phương pháp không tồn tại (getDefaultOptions). Nó phải là "setDefaultOptions". , thậm chí đặt tùy chọn * query_builder * trong phương thức "setDefaultOptions" nó không hoạt động, chỉ vì nó không phải là một tùy chọn có sẵn. –

4

Giả sử UserTask của bạn là mối quan hệ Bạn sẽ tìm thấy câu trả lời cho trường hợp của bạn here. Đây chỉ là cách sắp xếp nhưng nếu bạn đã yêu cầu một số điều kiện WHERE nó không phải là quá đơn giản nhưng không phải là khó.

Tôi phải lọc ra một số thực thể, chìa khóa để giải quyết nó là tạo ra phương thức set/get trong lớp thực thể trả về tập hợp được yêu cầu.

Trong trường hợp của tôi nó trông như thế này

/** 
* Set values 
* 
* @param ArrayCollection $values 
* @return Attribute 
*/ 
public function setCustomValues($values) 
{ 
    $result = $this->getNotCustomValues(); 
    foreach ($values as $value) 
    { 
     $value->setAttribute($this); 
     $result->add($value); 
    } 
    $this->values = $result; 

    return $this; 
} 

/** 
* Get values 
* 
* @return \Doctrine\Common\Collections\Collection 
*/ 
public function getCustomValues() 
{ 
    $result = new ArrayCollection(); 
    foreach ($this->values as $value) { 
     if($value->getCustom()) { 
      $result->add($value); 
     } 
    } 
    return $result; 
} 

Và khi tạo hình thức, tên cho một lĩnh vực là "customvalues" thay vì "giá trị" Vì vậy, bộ sưu tập của tôi chỉ chứa các giá trị với lĩnh vực tùy chỉnh đúng.

0

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!

0

Trong Symfony 2.7 i giải quyết điều này bằng cách làm như sau trong UserTaskType:

<?php 

namespace AppBundle\Form; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolver; 
use Doctrine\ORM\EntityRepository; 

class UserTaskType extends AbstractType 
{ 

    /** 
    * @param FormBuilderInterface $builder 
    * @param array $options 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 

     $builder 
      ->add('the_name', 'entity', array(
       'class' => 'acme\myBundle\Entity\UserTask', 
       'query_builder' => function (EntityRepository $er) { 
        return $er->createQueryBuilder('u') 
         ->where('u.id > :id') 
         ->setParameter('id', '1') 
         ->orderBy('u.username', 'ASC'); 
       }, 
      )); 
    } 

    /** 
    * @param OptionsResolver $resolver 
    */ 
    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'acme\myBundle\Entity\UserTask', 
     )); 
    } 

}