symfony2.3,使用foregin密钥持久保存相关实体

时间:2015-07-20 05:41:59

标签: php symfony doctrine-orm symfony-2.3

我正在寻找通过symfony 2.3中的doctrine将2个对象持久化到db的好方法

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,但我不想,我想要的是会议默认情况下附加到Cat on create,更新。我是否需要更改CatMeeting实体中的内容?我不知道我是否清楚,抱歉我的英语不好

1 个答案:

答案 0 :(得分:0)

您需要在MeetingType中删除此行:

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

然后在你的控制器中保存你的Cat实体和你的会议实体(你可以使用cat的getMeetings方法找到它)。

如果您希望一次性保留两者,请查看cascade operation for Doctrine entities.