gpt4 book ai didi

php - Symfony2 ManytoMany 双向关系 - 如何手动持久化

转载 作者:可可西里 更新时间:2023-10-31 23:45:47 24 4
gpt4 key购买 nike

我正在处理一个包含 2 个输入字段和一个提交按钮的表单。第一个字段是一个简单的下拉列表(类别),而另一个是标签输入字段(标签),您可以在其中一次输入多个标签。这两个字段仅接受预定义的输入选项。

类别选项值在 javascript 中硬编码:

categories = [
{"id": 1, "categoryname": "standard"},
{"id": 2, "categoryname": "premium"},
{"id": 3, "categoryname": "gold"}
];

tag 的选项是从数据库中的tag 表中获取的。这是数据库表的屏幕截图:

enter image description here

Category 和 Tag 实体与 Doctrine 的 ManytoMany 双向关系相关联,类别是拥有方。

注意:我没有使用 Symfony formType 创建表单,而是使用了 javascript。

javascript 工作正常,我在我的 Controller 中获取了输入数据。 问题 是我从来没有手动坚持多对多关系。阅读了文档,但不确定我是否遗漏了什么。

这是标签实体(Tag.php):

<?php

namespace AppBundle\Entity;

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
use AppBundle\Entity\Category;

/**
* Tag
*
* @ORM\Table(name="tag")
* @ORM\Entity(repositoryClass="AppBundle\Repository\TagRepository")
*/
class Tag {

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

/**
*
* @var string
*
* @ORM\Column(name="TagName", type="string")
*/
protected $tagname;

/**
* @ORM\ManyToMany(targetEntity="Category", mappedBy="tags")
*/
protected $categories;

/**
* @return ArrayCollection
*/
public function __construct() {
$this->categories = new ArrayCollection();
}

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


/**
* Set id
*
* @return Tag
*/
public function setId($id)
{
return $this->id = $id;
}

/**
* Set tagname
*
* @param string $tagname
* @return Tag
*/
public function setTagname($tagname)
{
$this->tagname = $tagname;

return $this;
}

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

/**
* Add categories
*
* @param \AppBundle\Entity\Category $categories
* @return Tag
*/
public function addCategory(\AppBundle\Entity\Category $categories)
{
$this->categories[] = $categories;

return $this;
}

/**
* Remove categories
*
* @param \AppBundle\Entity\Category $categories
*/
public function removeCategory(\AppBundle\Entity\Category $categories)
{
$this->categories->removeElement($categories);
}

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

这是类别实体 (Category.php):

<?php

namespace AppBundle\Entity;

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
use AppBundle\Entity\Tag;

/**
* Category
*
* @ORM\Table(name="category")
* @ORM\Entity(repositoryClass="AppBundle\Repository\CategoryRepository")
*/
class Category {

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

/**
*
* @var string
*
* @ORM\Column(name="CategoryName", type="string")
*/
protected $categoryname;

/**
*
* @var string
*
* @ORM\Column(name="Description", type="string")
*/
protected $description;

/**
* @ORM\ManyToMany(targetEntity="Tag", cascade={"persist"}, inversedBy="categories")
*/
protected $tags;

/**
* @return ArrayCollection
*/
public function __construct() {
$this->tags = new ArrayCollection();
}

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

/**
* Set id
*
* @return Category
*/
public function setId($id) {
return $this->id = $id;
}

/**
* Set categoryname
*
* @param string $categoryname
* @return Category
*/
public function setCategoryname($categoryname) {
$this->categoryname = $categoryname;

return $this;
}

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

/**
* Set description
*
* @param string $description
* @return Category
*/
public function setDescription($description) {
$this->description = $description;

return $this;
}

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

/**
* Add tags
*
* @param \AppBundle\Entity\Tag $tags
* @return Category
*/
public function addTag(\AppBundle\Entity\Tag $tags) {
$this->tags[] = $tags;

return $this;
}

/**
* Remove tags
*
* @param \AppBundle\Entity\Tag $tags
*/
public function removeTag(\AppBundle\Entity\Tag $tags) {
$this->tags->removeElement($tags);
}

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

}

这是 Controller (DefaultController.php):

/**
* @Route("/formsubmit", options={"expose"=true}, name="my_route_to_submit")
*/
public function submitAction(Request $request) {
$jsonString = file_get_contents('php://input');
$form_data = json_decode($jsonString, true);

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

// set category details
$categoryId = $form_data[0]['id'];
$category = $em->getRepository('AppBundle:Category')->findOneById($categoryId);

// set tags
$len = count($form_data[1]);

for ($i = 0; $i < $len; $i++) {
$tagId = $form_data[1][$i]['id'];
$tag = $em->getRepository('AppBundle:Tag')->findOneById($tagId);
$category->addTag($tag);
}

// persist/save in database
$em->persist($category);
$em->flush();
}

$form_data 是一个包含输入类别和添加标签详细信息的数组。它看起来像这样:

$form_data = [
['id' => 3, 'categoryname' => 'gold'],
[
['id' => 1, 'tagname' => 'wifi'],
['id' => 4, 'tagname' => 'geyser'],
['id' => 2, 'tagname' => 'cable']
]
];

它仍然没有持续存在。 var_dump($category); 显示带有类别 idcategoryname 的选定类别对象,但关联的 tags属性为空。

这是输出的屏幕截图:

enter image description here

有什么想法吗?

侧面的快速问题:我是否需要在此处的关系定义的两侧添加 cascade={"persist"}

编辑:在这里,我对$form_data 进行了硬编码,而不是像上面那样使用输入数据。 DefaultController.php:

    /**
* @Route("/formsubmit", options={"expose"=true}, name="my_route_to_submit")
*/
public function submitAction(Request $request) {
$form_data = [
['id' => 3, 'categoryname' => 'gold'],
[
['id' => 1, 'tagname' => 'wifi'],
['id' => 4, 'tagname' => 'geyser'],
['id' => 2, 'tagname' => 'cable']
]
];

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

// set category details
$categoryId = $form_data[0]['id'];
$category = $em->getRepository('AppBundle:Category')->findOneById($categoryId);

// set tags
$len = count($form_data[1]);

for ($i = 0; $i < $len; $i++) {
$tagId = $form_data[1][$i]['id'];
$tag = $em->getRepository('AppBundle:Tag')->findOneById($tagId);
// $tag->addCategory($category);
$category->addTag($tag);
}
var_dump($category);
exit;

// persist/save in database
$em->persist($category);
$em->flush();
}

Controller 输出:

enter image description here

如您所见,类别对象的 tags 属性仍然是空的。

希望这有助于更好地理解问题。等待回应...

最佳答案

通过做得到合适的标签实体时

 $tag = $em->getRepository('AppBundle:Tag')->findOneById($tagId);

$tag的值不就是一个集合数组吗?

那么可能会做以下事情吗?

    $category->addTag($tag[0]);

关于php - Symfony2 ManytoMany 双向关系 - 如何手动持久化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38306116/

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