Doctrine single table 继承 - 多对多关联不起作用
Doctrine single table inheritance - many-to-many assocication not working
我有包含不同属性的不同类型的用户,即
1. Customer, fields=[name, email]
2. Professional, fields=[name, email, region, locations, categories, timeslots]
3. Admin, fields=[name, email]
我预计以后会添加一些其他类型的用户。我正在使用来自学说的单一 table 继承,这是我的 类。
1. User.php
namespace UserBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Security\Core\User\UserInterface;
/**
* @ORM\Entity
* @ORM\InheritanceType("SINGLE_TABLE")
* @ORM\Table(name="user")
* @ORM\DiscriminatorColumn(name="discr", type="string")
* @ORM\DiscriminatorMap({"user" = "UserBundle\Entity\User", "customer"="UserBundle\Entity\Customer", "professional"="UserBundle\Entity\Professional", "admin"="UserBundle\Entity\Admin"})
* @ORM\Entity(repositoryClass="UserBundle\Entity\UserRepository")
*/
class User implements UserInterface
{
/**
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\Column(name="name", type="string", length=100, nullable=false)
*/
private $name;
/**
* @ORM\Column(name="email", type="string", length=100, unique=true, nullable=false)
*/
private $email;
}
2。 Professional.php
<?php
namespace UserBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use UserBundle\Entity\User;
/**
* @ORM\Entity
*/
class Professional extends User
{
/**
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\Region", inversedBy="professionals", cascade={"persist"})
* @ORM\JoinColumn(name="region_id", referencedColumnName="id", unique=false, nullable=true)
*/
private $region;
/* @ORM\ManyToMany(targetEntity="AppBundle\Entity\Location")
* @ORM\JoinTable(name="professional_location",
* joinColumns={@ORM\JoinColumn(name="professional_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="location_id", referencedColumnName="id", unique=false)}
* )
*/
private $locations;
/* @ORM\ManyToMany(targetEntity="AppBundle\Entity\Category")
* @ORM\JoinTable(name="professional_category",
* joinColumns={@ORM\JoinColumn(name="professional_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="category_id", referencedColumnName="id", unique=false)}
* )
*/
private $categories;
/**
* @ORM\OneToMany(targetEntity="UserBundle\Entity\Timeslot", mappedBy="professional", cascade={"persist"})
*/
private $timeslots;
3。 Customer.php
<?php
namespace UserBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use UserBundle\Entity\User;
/**
* @ORM\Entity
*/
class Customer extends User
{
public function getRoles()
{
return ['ROLE_CUSTOMER'];
}
}
问题是,当我创建模式时,它忽略了专业实体中关联的创建,例如 table 没有创建位置和类别,但是区域关联有效。
我知道我可以使用@MappedSuperclass,这种方法的问题是重复,这会创建 3 个 table 具有我试图避免的类似列。
如何使多对多关联与 doctrine2 中的单个 table 继承一起工作。
谢谢。
我解决了这个问题,似乎是用于多对多的语法的问题,上面的语法在没有继承的情况下有效,但不会有继承,因此我将其更改为以下 Professional.php
/**
* @ORM\ManyToMany(targetEntity="AppBundle\Entity\Location", inversedBy="professionals", cascade={"persist"})
* @ORM\JoinColumn(name="location_id", referencedColumnName="id", unique=false, nullable=true)
*/
protected $locations;
/**
* @ORM\ManyToMany(targetEntity="AppBundle\Entity\Category", inversedBy="professionals", cascade={"persist"})
* @ORM\JoinColumn(name="category_id", referencedColumnName="id", unique=false, nullable=true)
*/
protected $categories;
它创建了 professional_location
和 professional_category
table 具有多对多关联。
我有包含不同属性的不同类型的用户,即
1. Customer, fields=[name, email]
2. Professional, fields=[name, email, region, locations, categories, timeslots]
3. Admin, fields=[name, email]
我预计以后会添加一些其他类型的用户。我正在使用来自学说的单一 table 继承,这是我的 类。
1. User.php
namespace UserBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Security\Core\User\UserInterface;
/**
* @ORM\Entity
* @ORM\InheritanceType("SINGLE_TABLE")
* @ORM\Table(name="user")
* @ORM\DiscriminatorColumn(name="discr", type="string")
* @ORM\DiscriminatorMap({"user" = "UserBundle\Entity\User", "customer"="UserBundle\Entity\Customer", "professional"="UserBundle\Entity\Professional", "admin"="UserBundle\Entity\Admin"})
* @ORM\Entity(repositoryClass="UserBundle\Entity\UserRepository")
*/
class User implements UserInterface
{
/**
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\Column(name="name", type="string", length=100, nullable=false)
*/
private $name;
/**
* @ORM\Column(name="email", type="string", length=100, unique=true, nullable=false)
*/
private $email;
}
2。 Professional.php
<?php
namespace UserBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use UserBundle\Entity\User;
/**
* @ORM\Entity
*/
class Professional extends User
{
/**
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\Region", inversedBy="professionals", cascade={"persist"})
* @ORM\JoinColumn(name="region_id", referencedColumnName="id", unique=false, nullable=true)
*/
private $region;
/* @ORM\ManyToMany(targetEntity="AppBundle\Entity\Location")
* @ORM\JoinTable(name="professional_location",
* joinColumns={@ORM\JoinColumn(name="professional_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="location_id", referencedColumnName="id", unique=false)}
* )
*/
private $locations;
/* @ORM\ManyToMany(targetEntity="AppBundle\Entity\Category")
* @ORM\JoinTable(name="professional_category",
* joinColumns={@ORM\JoinColumn(name="professional_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="category_id", referencedColumnName="id", unique=false)}
* )
*/
private $categories;
/**
* @ORM\OneToMany(targetEntity="UserBundle\Entity\Timeslot", mappedBy="professional", cascade={"persist"})
*/
private $timeslots;
3。 Customer.php
<?php
namespace UserBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use UserBundle\Entity\User;
/**
* @ORM\Entity
*/
class Customer extends User
{
public function getRoles()
{
return ['ROLE_CUSTOMER'];
}
}
问题是,当我创建模式时,它忽略了专业实体中关联的创建,例如 table 没有创建位置和类别,但是区域关联有效。
我知道我可以使用@MappedSuperclass,这种方法的问题是重复,这会创建 3 个 table 具有我试图避免的类似列。
如何使多对多关联与 doctrine2 中的单个 table 继承一起工作。
谢谢。
我解决了这个问题,似乎是用于多对多的语法的问题,上面的语法在没有继承的情况下有效,但不会有继承,因此我将其更改为以下 Professional.php
/**
* @ORM\ManyToMany(targetEntity="AppBundle\Entity\Location", inversedBy="professionals", cascade={"persist"})
* @ORM\JoinColumn(name="location_id", referencedColumnName="id", unique=false, nullable=true)
*/
protected $locations;
/**
* @ORM\ManyToMany(targetEntity="AppBundle\Entity\Category", inversedBy="professionals", cascade={"persist"})
* @ORM\JoinColumn(name="category_id", referencedColumnName="id", unique=false, nullable=true)
*/
protected $categories;
它创建了 professional_location
和 professional_category
table 具有多对多关联。