【问题标题】:Foreign key not stored in database using embed form in symfony 3外键未使用 symfony 3 中的嵌入形式存储在数据库中
【发布时间】:2017-05-31 12:40:59
【问题描述】:

我有以下实体、表单类型和控制器

实体客户端

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;

/**
 * Client
 *
 * @ORM\Table(name="client")
 * @ORM\Entity(repositoryClass="AppBundle\Repository\ClientRepository")
 */
class Client
{
    /**
     * @var int
     *
     * @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;

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

    /**
     * @ORM\OneToMany(targetEntity="Contacts", mappedBy="client", cascade={"persist"})
     */
    private $contacts;


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

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

        return $this;
    }

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

    /**
     * Set address
     *
     * @param string $address
     *
     * @return Client
     */
    public function setAddress($address)
    {
        $this->address = $address;

        return $this;
    }

    /**
     * Get address
     *
     * @return string
     */
    public function getAddress()
    {
        return $this->address;
    }
    /**
     * Constructor
     */
    public function __construct()
    {
        $this->contacts = new \Doctrine\Common\Collections\ArrayCollection();
    }

    /**
     * Add contact
     *
     * @param \AppBundle\Entity\Contacts $contact
     *
     * @return Client
     */
    public function addContact(\AppBundle\Entity\Contacts $contact)
    {
        $this->contacts[] = $contact;

        return $this;
    }

    /**
     * Remove contact
     *
     * @param \AppBundle\Entity\Contacts $contact
     */
    public function removeContact(\AppBundle\Entity\Contacts $contact)
    {
        $this->contacts->removeElement($contact);
    }

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

联系人实体如下

<?php

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Contacts
 *
 * @ORM\Table(name="contacts")
 * @ORM\Entity(repositoryClass="AppBundle\Repository\ContactsRepository")
 */
class Contacts
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

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

    /**
     * @var int
     *
     * @ORM\Column(name="user_type", type="smallint")
     */
    private $userType;

    /**
     * @ORM\ManyToOne(targetEntity="Client", inversedBy="contacts")
     * @ORM\JoinColumn(name="client_id", referencedColumnName="id")
    */
    private $client;


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

    /**
     * Set fullname
     *
     * @param string $fullname
     *
     * @return Contacts
     */
    public function setFullname($fullname)
    {
        $this->fullname = $fullname;

        return $this;
    }

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

    /**
     * Set userType
     *
     * @param integer $userType
     *
     * @return Contacts
     */
    public function setUserType($userType)
    {
        $this->userType = $userType;

        return $this;
    }

    /**
     * Get userType
     *
     * @return int
     */
    public function getUserType()
    {
        return $this->userType;
    }

    /**
     * Set client
     *
     * @param \AppBundle\Entity\Client $client
     *
     * @return Contacts
     */
    public function setClient(\AppBundle\Entity\Client $client = null)
    {
        $this->client = $client;

        return $this;
    }

    /**
     * Get client
     *
     * @return \AppBundle\Entity\Client
     */
    public function getClient()
    {
        return $this->client;
    }
}

客户表格类型如下

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use AppBundle\Entity\Client;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\CollectionType;


class ClientForm extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name', TextType::class, array('attr' => array('class' => 'form-control', 'placeholder' => 'Client Name')))
            ->add('address', TextType::class, array('attr' => array('class' => 'form-control', 'placeholder' => 'Address')))
            ->add('contacts', CollectionType::class, array(
                    // each entry in the array will be an "email" field
                    'entry_type'   => ContactsForm::class,
                    'allow_add' => true,
                    'allow_delete' => true,
                    'prototype' => true,
                ))
            ->add('save', SubmitType::class)
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => Client::class,
        ));
    }
}

联系人表单类型如下

<?php
namespace AppBundle\Form;

use AppBundle\Entity\Contacts;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\TextType;

class ContactsForm extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('fullname', TextType::class, array('attr' => array('class' => 'form-control', 'placeholder' => 'Full Name')))
                ->add('user_type', TextType::class, array('attr' => array('class' => 'form-control', 'placeholder' => 'Co-Owner'))
                );
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => Contacts::class,
        ));
    }
}

最后,将数据存储在两个不同表中的控制器是客户端作为主表,联系人具有外部 ken 作为来自表客户端的 client_id,如下所示

/

**
     * @Route("/client/add", name="add_client")
     */
    public function addClientAction(Request $request)
    {
        $client = new Client();
        $form = $this->createForm(ClientForm::class, $client);
        $form->handleRequest($request);

        if($form->isSubmitted() && $form->isValid()) {

            $client = $form->getData();
            $em = $this->getDoctrine()->getManager();
            $em->persist($client);
            $em->flush();

            $this->addFlash(
                'notice',
                'Client Added!'
            );
            return $this->redirectToRoute('homepage');
        }
        return $this->render('default/addClient.html.twig', array('form' => $form->createView()));


    }

这里的问题是两个表都添加了数据,但是添加的客户端的外键没有存储在表contacts中,值为null

This solution 似乎适用于某些人可能适用于旧版本的 symfony

但对我来说不是运气。如何插入外国身份证。我是 symfony 新手,我正在使用 symfony 3.2

【问题讨论】:

  • 我创建了另一个实体,比如说项目和所有与联系人实体相同的东西,这对我有用 public function addProject(\AppBundle\Entity\Projects $project) { $this->projects[] = $项目; $project->setClient($this);返回$这个;此代码将客户端密钥存储在项目表上,但我仍然不确定联系人实体有什么问题。我删除了与联系人相关的所有内容,清除了缓存并创建了新的,按照项目完成的所有操作,但客户端 ID 未存储在联系人表中。

标签: database forms doctrine symfony-3.2


【解决方案1】:

对我来说,这似乎有点混乱。 我想你应该从 ContactController addAction 添加一个联系人。

比在您的联系人表单类型中添加 EntityType,这样您就可以为您的联系人选择一个客户。以下是一些示例:http://symfony.com/doc/current/reference/forms/types/entity.html

或者你也可以在presist之前通过简单的$contact->setClient($client)手动设置客户端。

PS:将联系人实体重命名为联系人。有点混乱)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-08
    • 2019-07-10
    • 2017-10-18
    • 2017-12-20
    • 2015-01-25
    • 1970-01-01
    • 1970-01-01
    • 2016-08-20
    相关资源
    最近更新 更多