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