使用2个oneToMany关系保存在数据库实体中

时间:2014-01-26 04:48:22

标签: php symfony doctrine-orm

我解释我的问题,对不起我的英语! 我有2个实体:项目和运营。每个项目都可以有更多的操作,每个操作都可以有不同的价格。 所以,我创建了一个新实体ProgettoOperazionePrezzo

/**
 * @var integer
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;


/**
 * @var float
 *
 * @ORM\Column(name="prezzo", type="decimal")
 */
private $prezzo;


/**
 * Get id
 *
 * @return integer 
 */
public function getId()
{
    return $this->id;
}

/**
 * Set prezzo
 *
 * @param float $prezzo
 * @return ProgettoOperazionePrezzo
 */
public function setPrezzo($prezzo)
{
    $this->prezzo = $prezzo;

    return $this;
}

/**
 * Get prezzo
 *
 * @return float 
 */
public function getPrezzo()
{
    return $this->prezzo;
}


 /**
 * @ORM\ManyToOne(targetEntity="Progetto")
 * @ORM\JoinColumn(name="progetto_id", referencedColumnName="id")
 **/
private $progetto;

/**
 * Set progetto
 *
 * @param \Management\ProgettiBundle\Entity\Progetto $progetto
 * @return ProgettoOperazionePrezzo
 */
public function setProgetto(\Management\ProgettiBundle\Entity\Progetto $progetto = null)
{
    $this->progetto = $progetto;

    return $this;
}

/**
 * Get progetto
 *
 * @return \Management\ProgettiBundle\Entity\Progetto 
 */
public function getProgetto()
{
    return $this->progetto;
}

/**
 * @ORM\ManyToOne(targetEntity="Operazione")
 * @ORM\JoinColumn(name="operazione_id", referencedColumnName="id")
 **/
private $operazione;

/**
 * Set operazione
 *
 * @param \Management\ProgettiBundle\Entity\Operazione $operazione
 * @return ProgettoOperazionePrezzo
 */
public function setOperazione(\Management\ProgettiBundle\Entity\Operazione $operazione = null)
{
    $this->operazione = $operazione;

    return $this;
}

/**
 * Get operazione
 *
 * @return \Management\ProgettiBundle\Entity\Operazione 
 */
public function getOperazione()
{
    return $this->operazione;
}

现在我想创建一个表单,以便在数据库中保存我使用checkbutton选择的所有操作。

 $operazione =   new ProgettoOperazionePrezzo();
    $progetto   =   $this->getDoctrine()->getRepository('ManagementProgettiBundle:ProgettoOperazionePrezzo')->find($id_progetto);

    $form       =   $this->createFormBuilder($operazione)
                          ->add('operazione','entity',array(
            'label'=>'Operazioni da effettuare:',
            'multiple'=>true,
            'expanded'=>true,
            'class'=>'ManagementProgettiBundle:Operazione',
            'property'=>'nome',
            'query_builder' => function(EntityRepository $er) 
                               {
                                   return $er->createQueryBuilder('u')
                                              ->orderBy('u.nome', 'ASC');
                               }))
                             ->add('Passo successivo','submit');
    $form->handleRequest($request);
 if($form->isValid()){

                    $em = $this->getDoctrine()->getManager();
                    $operazione->setProgetto($progetto);
                    $em->persist($operazione);
                    $em->flush();

                    //return $this->redirect($this->generateUrl('management_progetti_nuovo_progetto_p3',array('id_progetto'=>$id_progetto)));

             }

我没有问题来显示表单...但是当我尝试在数据库中保存我的选择时它会工作,因为它给了我这个错误:

Catchable Fatal Error: Argument 1 passed to Management\ProgettiBundle\Entity\ProgettoOperazionePrezzo::setOperazione() must be an instance of Management\ProgettiBundle\Entity\Operazione, instance of Doctrine\Common\Collections\ArrayCollection given, called in D:\xampp\htdocs\alemanno_management\vendor\symfony\symfony\src\Symfony\Component\PropertyAccess\PropertyAccessor.php on line 345 and defined in D:\xampp\htdocs\alemanno_management\src\Management\ProgettiBundle\Entity\ProgettoOperazionePrezzo.php line 108

我做错了什么?!!?也许全部?请...你能告诉我怎么解决这个问题?!

2 个答案:

答案 0 :(得分:0)

因为您从数据库中获取多个结果,所以$progetto变量将包含一个ArrayCollection实例,您应该通过该实例进行迭代。因为您的查询包含一个唯一的ID,所以我假设您只想获取一个结果:

$progetto   =   $this->getDoctrine()->getRepository('ManagementProgettiBundle:ProgettoOperazionePrezzo')->findOneBy(array('id' => $id_progetto));

现在,您的$progetto变量应指向Management\ProgettiBundle\Entity\Operazione

的实例

答案 1 :(得分:0)

请尝试使用下一个实体:

/**
 * @var integer
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;


/**
 * @var float
 *
 * @ORM\Column(name="prezzo", type="decimal")
 */
private $prezzo;


/**
 * Get id
 *
 * @return integer 
 */
public function getId()
{
    return $this->id;
}

/**
 * Set prezzo
 *
 * @param float $prezzo
 * @return ProgettoOperazionePrezzo
 */
public function setPrezzo($prezzo)
{
    $this->prezzo = $prezzo;

    return $this;
}

/**
 * Get prezzo
 *
 * @return float 
 */
public function getPrezzo()
{
    return $this->prezzo;
}


 /**
 * @ORM\ManyToOne(targetEntity="Progetto")
 * @ORM\JoinColumn(name="progetto_id", referencedColumnName="id")
 **/
private $progetto;


/**
 * Set progetto
 *
 * @param \Management\ProgettiBundle\Entity\Progetto $progetto
 * @return ProgettoOperazionePrezzo
 */
public function setProgetto(\Management\ProgettiBundle\Entity\Progetto $progetto = null)
{
    $this->progetto = $progetto;

    return $this;
}

/**
 * Get progetto
 *
 * @return \Management\ProgettiBundle\Entity\Progetto 
 */
public function getProgetto()
{
    return $this->progetto;
}

public function __construct() {
    $this->operazione = new \Doctrine\Common\Collections\ArrayCollection();
}

/**
 * @ORM\ManyToOne(targetEntity="Operazione")
 * @ORM\JoinColumn(name="operazione_id", referencedColumnName="id")
 **/
private $operazione;

/**
 * Set operazione
 *
 * @param \Doctrine\Common\Collections\ArrayCollection $operazione
 * @return ProgettoOperazionePrezzo
 */
public function setOperazione(\Doctrine\Common\Collections\ArrayCollection $operazione = null)
{
    $this->operazione = $operazione;

    return $this;
}

/**
 * Get operazione
 *
 * @return \Doctrine\Common\Collections\ArrayCollection 
 */
public function getOperazione()
{
    return $this->operazione;
}