【问题标题】:ManyToMany relations in symfony doctrinesymfony 学说中的多对多关系
【发布时间】:2017-12-31 06:30:49
【问题描述】:

我有一个代理实体 有一个字段 $owns

看起来像

      /**
     * @ORM\ManyToMany(targetEntity="AppBundle\Entity\ShipType", inversedBy="owners")
     */
    protected $owns;

关于 ShipType 实体 我有

/**
 * @ORM\ManyToMany(targetEntity="AppBundle\Entity\Agency", mappedBy="owns")
 */
private $owners;

doctrine 创建了一个关系表,用于关联具有机构 ID 和船舶类型 ID 的表

我正在尝试获取一个表格,用于将每个代理分配到一个船舶类型(拥有) 我试图以代理的身份实现日志记录

目前为止

   public function gShips(Request $request): Response {
    $u = $this->getUser();
    $ag = new Agency();
    $form = $this->createForm(ChooseShipsType::class, $ag);
    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid()) {
        $em = $this->getDoctrine()->getManager();
        $a = $form->getData();
        $em->persist($a);
        $em->flush();

    }

    return $this->render('agency/sships.html.twig', [
        'adForm' => $form->createView()
    ]);
}

和表格

 public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('ships', EntityType::class, [
            'class' => 'AppBundle:ShipType',
            'expanded'  => true,
            'multiple'  => true,
        ])
        ->add('save', SubmitType::class)
    ;
}

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults([
        'data_class' => 'AppBundle\Entity\Agency'
    ]);
}

表单正在显示,但由于它正在尝试创建一个新的代理,所以无法使其持久化,我不知道如何使用这两个表之间的关系表

提前谢谢你

【问题讨论】:

    标签: php symfony doctrine-orm


    【解决方案1】:

    检查您的代理类的构造函数。确保它具有以下内容:

    $this->owns = new ArrayCollection();
    

    然后,确保你有一个addOwns() 方法:

    public function addOwns(ShipType $shipType) 
    {
        $this->owns[] = $shipType;
    }
    

    也是一个二传手:

    public function setOwns($owns)
    {
        if ($owns instanceof ArrayCollection) {
            $this->owns = $owns;
        } else {
            if (!$this->owns->contains($owns)) {
                $this->owns[] = $owns;
            }
            $this->owns;
        }
        return $this;
    }
    

    另外,请确保您的 getter 具有默认内容。应该可以的。

    PS:虽然你不应该将你的属性命名为动词,但那是另一回事。

    【讨论】:

    • 不客气。我更新了我的答案,因为前者有一些逻辑错误。无法在 ArrayCollection 上调用 is_array 方法。对不起!
    猜你喜欢
    • 1970-01-01
    • 2012-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多