2015-07-20 59 views
3

我正在寻找好的方法坚持2个对象通过学说的symfony到DB 2.3symfony2.3,坚持相关实体foregin关键

class CatController extends Controller 
{ 
/** 
* Creates a new Cat entity. 
* 
*/ 
public function createAction(Request $request) 
{ 
    $entity = new Cat(); 
    $form = $this->createCreateForm($entity); 
    $form->handleRequest($request); 

    if ($form->isValid()) { 
     $em = $this->getDoctrine()->getManager(); 
     $em->persist($entity); <-- Split it or what ? 
     $em->flush(); 

     return $this->redirect($this->generateUrl('cat_show', array('id' => $entity->getId()))); 
    } 

    return $this->render('ViszmanCatBundle:Cat:new.html.twig', array(
     'entity' => $entity, 
     'form' => $form->createView(), 
    )); 
} 

当表单验证,我可以得到数据后,创建2个与该数据对象,但我认为应该有这样做更明确的方式,上面的代码工作不是我想要的,它只是插入外键关联的实体,当我这样做:

class CatType extends AbstractType 
{ 
public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add('name', 'text') 
     ->add('meetings','collection', 
       array('type' => new MeetingType(), 
         'allow_add' => true, 
         'allow_delete' => true, 
         'prototype' => true, 
       ) 
     ); 
} 

class MeetingType extends AbstractType 
{ 
/** 
* @param FormBuilderInterface $builder 
* @param array $options 
*/ 
public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $plDays = array('Poniedziałek', 'Wtorek', 'Środa', 'Czwartek', 'Piątek', 'Sobota', 'Niedziela'); 
    $builder 
     ->add('meetingDay', 'choice', array('choices' => $plDays)) 
     ->add('meetingTime', 'time',) 
     ->add('cat', 'entity', array('class' => 'ViszmanCatBundle:Cat', 'property' => 'name')) 
    ; 
} 

实体:猫

namespace Viszman\CatBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* Cat 
* 
* @ORM\Table() 
* @ORM\Entity 
*/ 
class Congregation 
{ 
/** 
* @var integer 
* 
* @ORM\Column(name="id", type="integer") 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="AUTO") 
*/ 
private $id; 

/** 
* @var string 
* 
* @ORM\Column(name="name", type="string", length=255) 
*/ 
private $name; 

/** 
* @ORM\OneToMany(targetEntity="Viszman\CatBundle\Entity\Member", mappedBy="cat") 
*/ 
private $members; 

/** 
* @ORM\OneToMany(targetEntity="Viszman\CatBundle\Entity\Meeting", mappedBy="cat", cascade={"persist"}) 
*/ 
private $meetings; 

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

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

/** 
* Set name 
* 
* @param string $name 
* @return Cat 
*/ 
public function setName($name) 
{ 
    $this->name = $name; 

    return $this; 
} 

/** 
* Get name 
* 
* @return string 
*/ 
public function getName() 
{ 
    return $this->name; 
} 

/** 
* Add members 
* 
* @param \Viszman\CatBundle\Entity\Member $members 
* @return Cat 
*/ 
public function addMember(\Viszman\CatBundle\Entity\Member $members) 
{ 
    $this->members[] = $members; 

    return $this; 
} 

/** 
* Remove members 
* 
* @param \Viszman\CatBundle\Entity\Member $members 
*/ 
public function removeMember(\Viszman\CatBundle\Entity\Member $members) 
{ 
    $this->members->removeElement($members); 
} 

/** 
* Get members 
* 
* @return \Doctrine\Common\Collections\Collection 
*/ 
public function getMembers() 
{ 
    return $this->members; 
} 
/** 
* Add meetings 
* 
* @param \Viszman\CationBundle\Entity\Meeting $meetings 
* @return Cat 
*/ 
public function addMeeting(\Viszman\CatBundle\Entity\Meeting $meetings) 
{ 
    $this->meetings[] = $meetings; 

    return $this; 
} 

/** 
* Remove meetings 
* 
* @param \Viszman\CatBundle\Entity\Meeting $meetings 
*/ 
public function removeMeeting(\Viszman\CatBundle\Entity\Meeting $meetings) 
{ 
    $this->meetings->removeElement($meetings); 
} 

/** 
* Get meetings 
* 
* @return \Doctrine\Common\Collections\Collection 
*/ 
public function getMeetings() 
{ 
    return $this->meetings; 
} 

namespace Viszman\CatBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 

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

/** 
* @var integer 
* 
* @ORM\Column(name="meeting_day", type="smallint") 
*/ 
private $meetingDay; 


/** 
* @var \DateTime 
* 
* @ORM\Column(name="meeting_time", type="time") 
*/ 
private $meetingTime; 

/** 
* @ORM\ManyToOne(targetEntity="Viszman\CatBundle\Entity\Cat", inversedBy="meetings") 
* @ORM\JoinColumn(name="cat_id", referencedColumnName="id") 
*/ 
private $cat; 

public function __construct() 
{ 
    $this->created = new \DateTime(); 
} 


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

/** 
* Set meetingDay 
* 
* @param integer $meetingDay 
* @return Meeting 
*/ 
public function setMeetingDay($meetingDay) 
{ 
    $this->meetingDay = $meetingDay; 

    return $this; 
} 

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

/** 
* Set cat 
* 
* @param \Viszman\CatBundle\Entity\Cat $cat 
* @return Member 
*/ 
public function setCat(\Viszman\CatBundle\Entity\Cat $cat = null) 
{ 
    $this->cat = $cat; 

    return $this; 
} 

/** 
* Get cat 
* 
* @return \stdClass 
*/ 
public function getCat() 
{ 
    return $this->cat; 
} 

/** 
* Set meetingTime 
* 
* @param \DateTime $meetingTime 
* @return Meeting 
*/ 
public function setMeetingTime($meetingTime) 
{ 
    $this->meetingTime = $meetingTime; 

    return $this; 
} 

/** 
* Get meetingTime 
* 
* @return \DateTime 
*/ 
public function getMeetingTime() 
{ 
    return $this->meetingTime; 
} 

这生成嵌入式表格与不需要的数据,这意味着在Meeting部分我需要选择Cat,但我不想,我想要的是,会议是默认附加到猫创建,更新。我需要更改CatMeeting实体中的内容吗?我不知道我是不是清楚,对不起我的英文不好

+1

您可以编辑您的文章,并添加你的关系实体? – Roukmoute

回答

0

您需要删除该线路MeetingType:

->add('cat', 'entity', array('class' => 'ViszmanCatBundle:Cat', 'property' => 'name')) 

然后在YOUT控制器坚持你的猫实体和YOUT会议实体(你可以使用cat的getMeetings方法找到它)。

如果你想同时在一杆坚持,看看在cascade operation for Doctrine entities.