gpt4 book ai didi

php - 使用 Symfony 和 FOSRestBundle 保存多对一关系

转载 作者:搜寻专家 更新时间:2023-10-31 21:29:03 24 4
gpt4 key购买 nike

我在我的项目中使用带有 FOSRestBundle 的 symfony。我用我的代码制作了这个示例以降低复杂性。可能忘记重命名变量。

我在保存一篇只有一个类别的文章时遇到问题。这些类别已存在于数据库中。我不想创建新类别

我不确定完成这项工作的最佳做​​法是什么。所以我尝试了几种方法并记录了错误消息(请参阅 The Form-Type)

实体

class Article
{
private $id;
private $name;
/* this is ManyToOne */
private $category;

function getId() {/* ... */}
function setName($name) {/* ... */}
function getName() {/* ... */}
function setCategory(Category $cat) {/* ... */}
function getCategory() {/* ... */}
}

class Category
{
private $id;
private $name;

function getId() {/* ... */}
function setName($name) {/* ... */}
function getName() {/* ... */}
}

JSON POST

{
"name": "testName"
"category": {
"name": "nameOfAExistingCategory"
}
}

表单类型

class ArticleType extends AbstractType
{
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name')

// here i tried out several ways of saving the category
->add('category')
// error-message
//Argument 1 passed to AppBundle\\Entity\\Article::setCategory() must be an instance of AppBundle\\Entity\\Category, array given, called in \...../vendor\/symfony\/symfony\/src\/Symfony\/Component\/PropertyAccess\/PropertyAccessor.php on line 410 and defined",

// OR
->add('category', new CategoryType())
// error-message
// A new entity was found through the relationship 'AppBundle\\Entity\\Article#category' that was not configured to cascade persist operations for entity: AppBundle\\Entity\\Category@000000000c958844000000003bf8ec58. To solve this issue: Either explicitly call EntityManager#persist() on this unknown entity or configure cascade persist this association in the mapping for example @ManyToOne(..,cascade={\"persist\"}). If you cannot find out which entity causes the problem implement 'AppBundle\\Entity\\Category#__toString()' to get a clue


// OR
->add('category', 'entity', array(
'class' => 'AppBundle:Category',
))
// error-message
// message":"category:\n ERROR: This value is not valid
;
}

/* ... */
}

Controller

public function postAction(Request $request) {
$form = $this->createForm(
new ArticleType(),
new Article(),
array('method' => 'POST'));

$form->submit($request->request->all());

if (!$form->isValid()) {
throw new HttpException(Codes::HTTP_BAD_REQUEST, $form->getErrors(true, false));
}

$em = $this->getDoctrine()->getManager();

$article = $form->getData();
$em->persist($article);
$em->flush();

return $article;
}

最佳答案

这是工作示例:

实体

class Article
{
...
private $category;

...
function setCategory(Category $cat) {/* ... */}
function getCategory() {/* ... */}
}

class Category
{
private $id;

...

function getId() {/* ... */}
}

JSON POST

{
"name": "testName",
"category": 1
}

表单类型

public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name')
->add('category', 'entity', [
'class' => CATEGORY_CLASS,
'property' => 'id'
])
;
}

Controller

public function postAction(Request $request) {
$article = new Article();
$form = $this->createForm(
new ArticleType(),
$article,
array('method' => 'POST'));

$form->handleRequest($request);

if (!$form->isValid()) {
throw new HttpException(Codes::HTTP_BAD_REQUEST, $form->getErrors(true, false));
}

if ($form->isValid()) {
$em = $this->getDoctrine()->getManager();
$em->persist($article);
$em->flush();

return $article;
}

return $form;
}

关于php - 使用 Symfony 和 FOSRestBundle 保存多对一关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32232162/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com