symfony3当我保存一篇新文章时,用户id外键在我的文章表中保持为空

symfony3当我保存一篇新文章时,用户id外键在我的文章表中保持为空,symfony,foreign-keys,entity,relationship,fosuserbundle,Symfony,Foreign Keys,Entity,Relationship,Fosuserbundle,我解释我的情况: 我有两个实体,一个叫做fosuserBundle的“User”句柄,另一个叫做“Article”。我希望当我创建一篇新文章时,外键“fosUserId”也能保持不变 这是我的用户实体: <?php namespace AppBundle\Entity; use ArticleBundle\Entity\Article; use Doctrine\Common\Collections\ArrayCollection; use FOS\UserBundle\Model\U

我解释我的情况:

我有两个实体,一个叫做fosuserBundle的“User”句柄,另一个叫做“Article”。我希望当我创建一篇新文章时,外键“fosUserId”也能保持不变

这是我的用户实体:

<?php

namespace AppBundle\Entity;

use ArticleBundle\Entity\Article;
use Doctrine\Common\Collections\ArrayCollection;
use FOS\UserBundle\Model\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="fos_user")
 */
class User extends BaseUser
{
    /**
     * @ORM\OneToMany(targetEntity="ArticleBundle\Entity\Article", mappedBy="fosUserId")
     */
    private $articles;

    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    public function __construct()
    {
        parent::__construct();
        $this->articles = new ArrayCollection();
    }

    /**
     * Set $articles
     *
     *@Param array $articles
     *
     * Return User
     */
    public function setArticles($articles)
    {
        $this->articles = $articles;
    }

    /**
     * Get articles
     *
     * @return array
     */
    public function getArticles()
    {
        return array('articles' => $this->articles);
    }

    /**
     * Add article
     *
     * @param \ArticleBundle\Entity\Article $article
     *
     * @return User
     */
    public function addArticle(\ArticleBundle\Entity\Article $article)
    {
        $this->articles[] = $article;

        return $this;
    }

    /**
     * Remove article
     *
     * @param \ArticleBundle\Entity\Article $article
     */
    public function removeArticle(\ArticleBundle\Entity\Article $article)
    {
        $this->articles->removeElement($article);
    }
}

好的,我想我找到了问题,但很奇怪,因为你应该有一个错误。我不确定是否显示了激活的错误

但是,问题在于,您设置了一个不存在的属性:

public function setFosUserId($fosUserId)
{
    $this->user = $fosUserId; // Wrong attribute

    return $this;
}
而不是:

public function setFosUserId($fosUserId)
{
    $this->fosUserId = $fosUserId; // Right attribute

    return $this;
}

好的,我想我发现了问题,但很奇怪,因为你应该有一个错误。我不确定是否显示了激活的错误

但是,问题在于,您设置了一个不存在的属性:

public function setFosUserId($fosUserId)
{
    $this->user = $fosUserId; // Wrong attribute

    return $this;
}
而不是:

public function setFosUserId($fosUserId)
{
    $this->fosUserId = $fosUserId; // Right attribute

    return $this;
}

有几件事你需要改变

首先,正如@YaatSuka在其回答中所建议的,您的
AppBundle\User
-实体在
setFosUserId
函数中有一个错误:

public function setFosUserId($fosUserId)
{
    $this->user = $fosUserId; // Should be: $this->fosUserId = $fosUserId;

    return $this;
}
第二: 在控制器中,当您应该使用实体时,您只需获取用户的id:

$user = $this->container->get('security.token_storage')->getToken()->getUser()->getId();
应该是:

$user = $this->container->get('security.token_storage')->getToken()->getUser();
或者,由于您继承了基本Symfony控制器:

$user = $this->getUser();
最后,尽管这不应影响错误: 您根本不需要将fosUerId字段添加到表单中,因为您正在控制器中设置它


意思:您可以去掉表单类型中的隐藏字段。

您需要更改的一些内容

首先,正如@YaatSuka在其回答中所建议的,您的
AppBundle\User
-实体在
setFosUserId
函数中有一个错误:

public function setFosUserId($fosUserId)
{
    $this->user = $fosUserId; // Should be: $this->fosUserId = $fosUserId;

    return $this;
}
第二: 在控制器中,当您应该使用实体时,您只需获取用户的id:

$user = $this->container->get('security.token_storage')->getToken()->getUser()->getId();
应该是:

$user = $this->container->get('security.token_storage')->getToken()->getUser();
或者,由于您继承了基本Symfony控制器:

$user = $this->getUser();
最后,尽管这不应影响错误: 您根本不需要将fosUerId字段添加到表单中,因为您正在控制器中设置它


意思是:你可以去掉表单类型中的隐藏字段。

你是否尝试过传递
实体而不是
id
(经过此更正)?是
if($form->isSubmitted()&&&&$form->isValid()){$user=$this->container->get('security.token\u storage')->getToken()->getUser()$article->setFosUserId($user);
您是否尝试传递
实体而不是
id
(在此更正之后)?是
if($form->isSubmitted()&&&$form->isValid()){$user=$this->container->get('security.token_storage')->getToken()->getUser();$article->setFosUserId($user);
作为提示(提高可读性):Symfonys基本控制器(您继承的)有一个
getUser()
方法。因此您可以在操作中执行
$this->getUser()
。作为提示(提高可读性):Symfonys基本控制器(您继承的)有一个
getUser())
方法。因此您可以在操作中执行
$this->getUser()
。当我尝试删除fosUserId字段时,会出现“此表单不应包含额外字段”错误。此字段成为额外数据…您知道为什么吗?如何呈现模板?只需一个简单的
{%extends'base.html.twig'}{%block body%}{{form_start(form,{'attr':{'class':'form control'}}}{{form_widget(form)}{{form_end(form)}}{{%endblock%}
您可以在原始问题中发布生成的HTML吗?如果您从表单类型中删除了
fosUserId
,则不应该呈现,也不应该抛出该错误。我猜您在删除该额外字段时没有在浏览器中刷新表单?是的,我可以刷新浏览器,但没有任何更改。当我尝试删除fo时我得到的sUserId字段“此表单不应包含额外字段”错误。此字段成为额外数据…你知道为什么吗?如何呈现模板?只是一个简单的
{%extends'base.html.twig'}{%block body%}{{form_start(form,{attr':{class':'form control'}}}{form u小部件(form)}{form end(form end)(form)}}{%endblock%}
您可以在原始问题中发布生成的HTML吗?如果您从表单类型中删除了
fosUserId
,则不应该呈现,也不应该抛出该错误。我猜您删除该额外字段时没有在浏览器中刷新表单?是的,我可以刷新浏览器,但没有任何更改。