【问题标题】:Many-To-Many relationship Doctrine多对多关系原则
【发布时间】:2015-04-05 15:46:00
【问题描述】:

我在当前的实体映射方面遇到了很多问题,所以我想就它的问题提出意见。

假设有以下表格示例与 Doctrine,但请记住,Group 可以有许多 Users,并且 User 可以成为许多群组

的一部分

用户

身份证

名字

组

身份证

标题

用户组

身份证

user_id

group_id

这是我目前的做法:

/**
 * User
 *
 * @ORM\Table(name="user")
 * @ORM\Entity(repositoryClass="SomeBundle\Entity\Repository\UserRepository")
 */
class User
{

    /**
     * @var integer
     * @ORM\Id
     * @ORM\Column(name="user_id", type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $user_id;
 // some other fields and functions here
}

组

/**
     * Group
     *
     * @ORM\Table(name="group", indexes={@ORM\Index(name="group_parent", columns={"parent_id"})})
     * @ORM\Entity(repositoryClass="SomeBundle\Entity\Repository\GroupRepository")
     */
    class Group
    {
        /**
         * @var integer
         *
         * @ORM\Column(name="category_id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="IDENTITY")
         */
        private $categoryId;
    // some other functions and variables here
}

...和用户组

/**
 * User_Groups
 *
 * @ORM\Table(name="user_groups",
 *             indexes={
 *                      @ORM\Index(name="user_group_user", columns={"user_id"}),
 *                      @ORM\Index(name="user_group_group", columns={"group_id"})
 *                     }
 * )
 * @ORM\Entity(repositoryClass="SomeBundle\Entity\Repository\UserGroupRepository")
 */
class UserGroup
{
    /**
     * @var integer
     *
     * @ORM\Id
     * @ORM\Column(name="user_group_id", type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $userGroupId;

      /**
     * @var \SomeBundle\Entity\User
     * @ORM\Column(name="user_id")
     *
     * @ORM\ManyToMany(targetEntity="SomeBundle\Entity\User", inversedBy="userGroups")
     * @ORM\JoinTable(name="users",
     * joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="userId")})
     */

    private $user;

    /**
     * @var SomeBundle\Entity\Category
     *
     * @ORM\ManyToOne(targetEntity="SomeBundle\Entity\Group", inversedBy="groups")
     * @ORM\JoinColumn(name="group_id", referencedColumnName="group_id")
     *
     */
    private $group;
/// etc
}

任何帮助将不胜感激!

【问题讨论】:

  • 还有什么问题?
  • 首先,我想对我的注释实现发表意见,因为我对此不是很有经验。其次,现在的错误是:“ContextErrorException: Catchable Fatal Error: Object of class SomeBundle\Entity\User could not be converted to string in ***/dev/vendor/doctrine/dbal/lib/Doctrine/DBAL/Statement.php line 120”

标签: php symfony doctrine-orm


【解决方案1】:

在这个例子中,我有一个product 和一个mesureUnit,它们是多对多的。 在您的情况下,您只需要user 和group。 UserGroups 是自动生成的。 多对多关系如下:

<?php
namespace TeamERP\StoresBundle\Entity;
use Doctrine\ORM\Mapping AS ORM;

/**
 * @ORM\Entity
 */
class MesureUnit
{
/**
 * @ORM\Id
 * @ORM\Column(type="integer")
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * @ORM\Column(type="string", length=100, nullable=true)
 */
private $name;

/**
 * @ORM\Column(type="string", length=10, nullable=true)
 */
private $abreviation;

/**
 * @ORM\OneToMany(targetEntity="TeamERP\StoresBundle\Entity\ProductActivity", mappedBy="mesureUnit")
 */
private $pproductActivity;

/**
 * @ORM\ManyToMany(targetEntity="TeamERP\StoresBundle\Entity\Product", mappedBy="mesureUnit")
 */
private $product;
/**
 * Constructor
 */
public function __construct()
{
    $this->pproductActivity = new \Doctrine\Common\Collections\ArrayCollection();
    $this->product = new \Doctrine\Common\Collections\ArrayCollection();
}

那么produc 类可能是这样的:

<?php
namespace TeamERP\StoresBundle\Entity;
use Doctrine\ORM\Mapping AS ORM;

/**
 * @ORM\Entity
 */
class Product
{
/**
 * @ORM\Id
 * @ORM\Column(type="integer")
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * @ORM\Column(type="string", length=50, nullable=true)
 */
private $code;

/**
 * @ORM\Column(type="string", length=250, nullable=true)
 */
private $description;

/**
 * @ORM\Column(type="datetime", nullable=true)
 */
private $date_received;

/**
 * @ORM\OneToMany(targetEntity="TeamERP\StoresBundle\Entity\ProductActivity", mappedBy="product")
 */
private $pproductActivity;

/**
 * @ORM\ManyToOne(targetEntity="TeamERP\StoresBundle\Entity\Category", inversedBy="product")
 * @ORM\JoinColumn(name="category_id", referencedColumnName="id")
 */
private $category;

/**
 * @ORM\ManyToOne(targetEntity="TeamERP\StoresBundle\Entity\AJob", inversedBy="product")
 * @ORM\JoinColumn(name="job_id", referencedColumnName="id")
 */
private $aJob;

/**
 * @ORM\ManyToMany(targetEntity="TeamERP\StoresBundle\Entity\MesureUnit", inversedBy="product")
 * @ORM\JoinTable(
 *     name="MesureUnit2Product",
 *     joinColumns={@ORM\JoinColumn(name="product_id", referencedColumnName="id", nullable=false)},
 *     inverseJoinColumns={@ORM\JoinColumn(name="mesure_unit_id", referencedColumnName="id", nullable=false)}
 * )
 */
private $mesureUnit;
/**
 * Constructor
 */
public function __construct()
{
    $this->pproductActivity = new \Doctrine\Common\Collections\ArrayCollection();
    $this->mesureUnit = new \Doctrine\Common\Collections\ArrayCollection();
}

你不需要手动创建表。它是由 Doctrine 生成的。

希望对你有帮助

【讨论】:

  • 非常感谢您对本示例的帮助。我肯定会试一试,早上第一件事,因为我现在无法访问代码。另外,非常感谢您提到 Doctrine 将自动创建连接表。省了我一些力气! :)
  • 如果你的意思是,测试相同的例子。该示例没有您必须添加的 setter 和 getter。您应该删除一些变量,尤其是与其他表的关系。这是一个更大项目的一部分。如果需要更多帮助,请发帖,我会尽力提供帮助。
  • 我有一个关于这个的问题:所以,假设我想保存 user 所属的 groups,目前我正在这样做:$userGroup = new UserGroup();$userGroup-&gt;setGroup($group);$userGroup-&gt;setUser($user); 但只要没有 UserGroup 实体,就会失败。有什么想法吗?
  • 您不与 UserGroup 表交互。基本上它们中的任何一个都可以拥有另一个的集合;一个组可以有很多用户,反之亦然。因此,您必须创建一个用户,例如一个用户,其中包含一个 Arraycollection 组,然后您可以保存该用户。看看这个例子:symfony.com/doc/current/cookbook/form/form_collections.html 专注于他们处理控制器的方式,其余的并不那么重要。
【解决方案2】:
/** @Entity **/
class User
{
    // ...

    /**
     * @ManyToMany(targetEntity="Group", inversedBy="users")
     * @JoinTable(name="users_groups")
     **/
    private $groups;

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

    // ...
}

/** @Entity **/
class Group
{
    // ...
    /**
     * @ManyToMany(targetEntity="User", mappedBy="groups")
     **/
    private $users;

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

    // ...
}

您的案例是多对多、双向关联 Doctrine association mapping

【讨论】:

  • @wti 提出的好观点 Doctrine 将生成表格,无需创建它。
  • 非常感谢您花时间为我提供一个非常有用的示例,Alexandru。那将是早上的第一件事,因为我现在无法访问代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-18
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
  • 2011-04-25
  • 1970-01-01
相关资源
最近更新 更多