symfony3当我保存一篇新文章时,用户id外键在我的文章表中保持为空
我解释我的情况: 我有两个实体,一个叫做fosuserBundle的“User”句柄,另一个叫做“Article”。我希望当我创建一篇新文章时,外键“fosUserId”也能保持不变 这是我的用户实体: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
<?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
,则不应该呈现,也不应该抛出该错误。我猜您删除该额外字段时没有在浏览器中刷新表单?是的,我可以刷新浏览器,但没有任何更改。