Php 多对多关系学说

Php 多对多关系学说,php,symfony,doctrine-orm,Php,Symfony,Doctrine Orm,我在当前的实体映射中遇到了很多问题,所以我想知道它的问题是什么 让我们以下表为例,以条令为例,但也要记住,一个组可以有许多用户,一个用户可以是许多组的一部分 使用者 身份证 名字 团体 身份证 头衔 用户组 身份证 用户id 组id 这是我目前的做法: /** * User * * @ORM\Table(name="user") * @ORM\Entity(repositoryClass="SomeBundle\Entity\Repository\UserRepository") */

我在当前的实体映射中遇到了很多问题,所以我想知道它的问题是什么

让我们以下表为例,以条令为例,但也要记住,一个组可以有许多用户,一个用户可以是许多组的一部分

使用者 身份证

名字

团体 身份证

头衔

用户组 身份证

用户id

组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
}
团体

…和用户组

/**
 * 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
}

任何帮助都将不胜感激

在本例中,我有一个
产品
和一个
计量单位
,它们与多对多相关。 在您的情况下,您只需要
用户
用户组
是自动生成的。 多对多关系按如下方式进行:

<?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();
}
您不需要手动创建表。它是由学说产生的

希望能有帮助

/** @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();
    }

    // ...
}
您的案例是多对多双向关联

问题是什么?首先,我想对我的注释实现有一点看法,因为我对这方面不是很有经验。其次,现在的错误是:“
ContextErrorException:Catchable致命错误:SomeBundle\Entity\User类的对象无法转换为***/dev/vendor/doctor/dbal/lib/doctor/dbal/Statement.php第120行中的字符串”@wti的观点很好,条令将生成表格,无需创建表格。非常感谢您花时间为我提供了一个非常有用的示例,Alexandru。这将是早上的第一件事,因为我现在无法访问代码。我非常感谢您对这个示例的帮助。我肯定会尝试一下,早上的第一件事,因为我现在没有访问代码的权限。另外,非常感谢您提到条令将自动创建联接表。帮我省了点力气!:)如果你的意思是,直接测试同一个例子。示例中没有setter和getter,您必须添加它们。您应该删除一些变量,尤其是与其他表的关系。这是一个更大项目的一部分。如果需要更多帮助,请发帖子,我会尽力提供帮助。我有一个问题:那么,假设我想保存用户所属的组,目前我正在这样做:
$userGroup=new userGroup()
$userGroup->setGroup($group)
$userGroup->setUser($user)但只要没有用户组实体,就会失败。有什么想法吗?你不能和用户组表交互。基本上,它们中的任何一个都可以有另一个的集合;一个组可以有许多用户,反之亦然。因此,您必须创建一个用户,并在其中创建一个组的Arraycollection,然后才能保存该用户。看看这个例子:关注他们处理控制器的方式,其余的就不那么重要了。
<?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();
}
/** @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();
    }

    // ...
}