gpt4 book ai didi

symfony - 多对多,Doctrine的实体生成器和复数化

转载 作者:行者123 更新时间:2023-12-04 19:39:25 25 4
gpt4 key购买 nike

Doctrine 的多对多逻辑让我有些困惑。我有一个非常简单的食谱与类别的多对多关系。我的基础实体类同样简单。

Recipe 实体类...

class Recipe
{
/**
* @ORM\ManyToMany(targetEntity="Category", inversedBy="categories")
* @ORM\JoinTable(name="recipe_category")
**/
private $categories;

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

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


public function __construct() {
$this->categories = new \Doctrine\Common\Collections\ArrayCollection();
}
}

还有Category实体类...

class Category
{
/**
* @ORM\ManyToMany(targetEntity="Recipe")
**/
private $recipes;

/**
* @var integer
*
* @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;


public function __construct() {
$this->recipes = new \Doctrine\Common\Collections\ArrayCollection();
}
}

看起来相当直截了当并且与 Doctrine(和 Symfony2 的)文档示例相匹配。当我尝试通过 Symfony 控制台应用程序为这些类生成 getter 和 setter 时,奇怪的行为出现了。

关系 setter / getter 不正确。以生成的 Recipe 类中的 Category setter 为例...

/**
* Add categories
*
* @param \Namespace\CookbookBundle\Entity\Category $categories
* @return Recipe
*/
public function addCategorie(\Namespace\CookbookBundle\Entity\Category $categories)
{
$this->categories[] = $categories;

return $this;
}

看起来方法名称的自动生成已关闭。它应该是“addCategory”并且应该传递一个“类别”。

虽然我可以手动更正此问题,但如果我重新运行实体生成器,它只会再次添加它们。

我是不是做错了,或者这只是实体生成器的一个怪癖?我可以通过注释指定覆盖吗?

最佳答案

您没有做错任何事情,因为 symfony 就是这样生成它们的。我通常不使用应用程序/控制台来生成它们,因为目前它们做得不好。一个例子就是你提到的单词的复数化。另一个明显的事实是它使用 [] 表示法,这几乎将 ArrayCollection 对象视为 PHP 数组。您永远不应该将 ArrayCollections 视为数组。

我自己是这样实现的:

public function addCategory(Category $category)
{
if (!$this->categories->contains($category)
$this->categories->add($category);

return $this;
}

如果 Array 集合已经添加,则不会将重复项添加到 Array 集合中。删除也一样:

public function removeCategory(Category $category)
{
if ($this->categories->contains($category)
$this->categories->remove($category);
}

我多次遇到的情况是,假设您有 4 个类别,您添加和删除它们

$r = new Recipe();
$c1 = new Category();
$c2 = new Category();


$r->addCategory($c1);
$r->addCategory($c2);
// at this point $r->getCategories()->toArray()[0] contains $c1
// and $r->getCategories()->toArray()[1] contains $c2

$r->removeCategory($c1);
// now $r->getCategories()->toArray()[0] is empty and
// $r->getCategories()->toArray()[1] contains $c2 still
// so in order to get the first category you need to:

$r->getCategories()->first();

关于symfony - 多对多,Doctrine的实体生成器和复数化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15256117/

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