IN的AcmePizza束,这是工作的罚款
->add('pizza', 'entity', array(
'class' => 'Acme\PizzaBundle\Entity\Pizza',
'query_builder' => function ($repository) { return $repository->createQueryBuilder('p')->orderBy('p.name', 'ASC'); },
))
我可以做类似的东西集合
->add('userTasks','collection',array('type' => new UserTaskType(),
'class' => 'acme\myBundle\Entity\UserTask',
'query_builder' => function ($repository) { return $repository->createQueryBuilder('p')->orderBy('p.name', 'ASC'); },
))
假设你userTasks是一个关系你会发现你的情况的答案在这里 。 这些仅仅是如何排序,但如果你有需要的一些有条件的地方也不是那么简单的,但也不是很难。
我不得不过滤掉一些实体,解决这个问题是要建立一套/在实体类get方法返回所需的一组关键。
在我的情况下,它看起来像这样
/**
* 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;
}
和创建表单时,名称字段为“customvalues”,而不是“值”所以,我的收藏只包含自定义字段真值。
你经常想,当你正在更新一个实体,没有一个新的,正确的过滤器回收?
这里是一个可行的解决方案,这是来自控制器(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));
}
$服务= ENTITY,$库存= ArrayCollection的($服务 - > getInventory())
这里的关键是要在这里使用学说的标准,更多的信息:
http://doctrine-orm.readthedocs.org/en/latest/reference/working-with-associations.html#filtering-collections
也想在移动实体本身的标准,使那里的公共方法。 当您从数据库中加载它,你可以使用火学说的餐后生命周期回调方法。 Ofcourse把它在实体将工作,如果你不需要像任何服务或事物。
另一种解决方案很可能是,移动的标准窗体中的事件Form类里面,如果你只需要一个形式里面的过滤。
如果您需要收集过滤,可以跨整个项目透明的,但是写一个学说监听器,并把代码中的餐后()方法中。 您也可以在注入听者主义的依赖,但我建议,因为延迟加载等业务注入容器本身,所以你没有得到循环服务的引用。
祝好运!
我点你正确的方向(我希望):
http://www.craftitonline.com/2011/08/symfony2-ajax-form-republish/
这篇文章与现场的依赖交易。 例如,当你选择一个国家,你必须属于该出现在列表中该国的城镇。
在Symfony的2.7我解决了这个做的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',
));
}
}
是。
在你UserTaskType类,添加下面的方法。
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');
}
);
}