我有一个问题要问您,请给我一些我正在做的事情,我将尽力解释一下这个想法。我有一个系统,用户可以将壁虎添加到数据库中,当添加壁虎时,它将用户ID保存到称为的列中user_id
-这很完美,并为我现在要实现的目标做好了准备。
我有一个系统,用户可以为该壁虎添加重量条目,问题是,现在它仅加载数据库中的每个壁虎,而不是特定于该用户的壁虎。
这是我Weight.php
实体的一部分:
/**
* @ORM\ManyToOne(targetEntity="Gecko", inversedBy="weights")
* @ORM\JoinColumn(name="gecko_id", referencedColumnName="id")
*/
private $geckoId;
链接到以下部分Gecko.php
:
/**
* @ORM\OneToMany(targetEntity="Weight", mappedBy="geckoId", cascade={"persist", "remove"})
*/
private $weights;
这是Gecko.php
实体内部的用户部分,该用户部分链接当前用户的ID以保存到数据库:
/**
* @ORM\ManyToOne(targetEntity="Breedr\UserBundle\Entity\User", inversedBy="geckos")
* @ORM\JoinColumn(name="user_id", referencedColumnName="id")
*/
protected $user;
以及User.php
实体中的链接部分:
/**
* @ORM\OneToMany(targetEntity="Breedr\GeckoBundle\Entity\Gecko", mappedBy="user", cascade={"persist", "remove"})
*/
protected $geckos;
现在,这是我的Weight
实体Form
(WeightType.php
):
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('weighedDate')
->add('weight')
->add('geckoId')
;
}
根据上面的部分,您会得到一个下拉列表,如下所示:
因此,我现在试图实现的是仅显示与当前用户ID链接的壁虎。实现此目标的最佳方法是什么?
提前致谢 :)
安迪
编辑:
这是我的WeightType
文件:
<?php
namespace Breedr\GeckoBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
class WeightType extends AbstractType
{
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('weighedDate')
->add('weight')
->add('geckoId')
;
}
/**
* @param OptionsResolverInterface $resolver
*/
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Breedr\GeckoBundle\Entity\Weight'
));
}
/**
* @return string
*/
public function getName()
{
return 'breedr_geckobundle_weight';
}
}
编辑2:这是我的创建表单片段:
private function createCreateForm(Weight $entity)
{
$form = $this->createForm(new WeightType(), $entity, array(
'action' => $this->generateUrl('weight_create'),
'method' => 'POST',
));
$form->add('submit', 'submit', array('label' => 'Create'));
return $form;
}
您必须使用实体字段类型+ query_build选项。因此,您可以构建一个自定义查询以过滤结果,例如:
<?php
namespace AppBundle\Form\Type;
use Doctrine\ORM\EntityRepository;
// ...
$builder->add('users', 'entity', array(
'class' => 'AcmeHelloBundle:User',
'query_builder' => function (EntityRepository $er) {
return $er->createQueryBuilder('u')
->orderBy('u.username', 'ASC');
},
));
在您的特定情况下,您的表单类型可能看起来像这样:
<?php
# maybe you need to fix some namespaces...
use Doctrine\ORM\EntityRepository;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
class WeightType extends AbstractType
{
/** @var int */
protected $currentUserId;
/**
* param int $currentUserId It can be passed from controller
* when creating form instance
*/
public function __construct($currentUserId)
{
$this->currentUserId = $currentUserId;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$id = $this->currentUserId;
$builder->add('users', 'entity', array(
'class' => 'GeckoBundle:Gecko',
'query_builder' => function (EntityRepository $er) use ($id) {
return $er->createQueryBuilder('g')
->where('user_id = ?')
->setParameter(0, $id);
},
));
}
}
在控制器上...
<?php
//...
public function add()
{
$currentUserId = $this->getUser()->getId(); # may be it...
$form = $this->createForm(new WeigthType($currentUserId));
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句