该项目使用多个用户登录(管道工、建筑商),每个实体的相关信息保存在各自的表中。下面提供了它们的结构。
我们一直在为供应商存储信息,现在已经收集了数百个条目。供应商现在需要登录才能访问系统。
带有鉴别器映射的当前流程是它在用户表中创建一个条目,然后保存在相应的用户类型表中,id 为 user.id。
User.id = 5 => plumber.id = 5
User.id = 6 => builder.id = 6
User.id = 7 => plumber.id = 7
供应商有自己的表,有自己的递增 ID,这会导致与 DiscriminatorMap()
发生冲突。有没有办法让供应商是唯一的,并像其他表一样连接到一个 supply.user_id 而不是 supply.id 上?
<?php
namespace Project\Entities;
abstract class BaseEntity
{
public static $idCol = 'id';
public static $joins = [];
public static $orderBy = [];
}
?>
<?php
namespace Project\Entities;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping AS ORM;
use Illuminate\Contracts\Auth\Authenticatable;
use Illuminate\Database\Eloquent\Model;
/**
* @ORM\Entity(repositoryClass="Project\Repositories\User\UserRepository")
* @ORM\Table(name="user")
* @ORM\InheritanceType("JOINED")
* @ORM\DiscriminatorColumn(name="type", type="string")
* @ORM\DiscriminatorMap({"user"="User", "plumber"="Plumber", "builder"="Builder"})
* @ORM\HasLifecycleCallbacks()
*/
class User extends BaseEntity implements Authenticatable
{
use \LaravelDoctrine\ORM\Auth\Authenticatable;
use \Project\Entities\Traits\HasContactDetails;
const TYPE_USER = "user";
const TYPE_PLUMBER = "plumber";
const TYPE_BUILDER = "builder";
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
* @var int
*/
protected $id;
/**
* @ORM\Column(type="string", unique=true, nullable=false)
* @var string
*/
protected $login;
/**
* @ORM\Column(type="text")
* @var string
*/
protected $password;
/**
* @return int
*/
public function getId() {
return $this->id;
}
/**
* @return string
*/
public function getLogin() {
return $this->login;
}
/**
* @param string $login
*/
public function setLogin($login) {
$this->login = $login;
}
public function getAuthPassword() {
return $this->password;
}
/**
* Encrypt password when inserting
* @ORM\PrePersist
*/
public function onPrePersist() {
$this->encryptPassword();
}
/**
* Encrypt password when updating
* @ORM\PreUpdate
*/
public function onPreUpdate(\Doctrine\ORM\Event\PreUpdateEventArgs $event) {
if ($event->hasChangedField('password')) {
$this->encryptPassword();
}
}
/**
*
* @return string
*/
public function getType() {
if ($this instanceof \Project\Entities\Plumber) {
return self::TYPE_PLUMBER;
}
if ($this instanceof \Project\Entities\Builder) {
return self::TYPE_BUILDER;
}
return self::TYPE_USER;
}
public function getAuthIdentifierName() {
return "login";
}
.....
}
?>
用户角色扩展
<?php
namespace Project\Entities;
use Doctrine\ORM\Mapping AS ORM;
/**
* @ORM\Entity(repositoryClass="Project\Repositories\Plumber\PlumberRepository")
* @ORM\Table(name="plumber")
*/
class Plumber extends User
{
.....
}
?>
<?php
namespace Project\Entities;
use Doctrine\ORM\Mapping AS ORM;
/**
* @ORM\Entity(repositoryClass="Project\Repositories\Builder\BuilderRepository")
* @ORM\Table(name="builder")
*/
class Builder extends User
{
.....
}
?>
当前的供应商实体。
<?php
namespace Project\Entities;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping AS ORM;
/**
* @ORM\Entity(repositoryClass="Project\Repositories\Supplier\SupplierRepository")
* @ORM\Table(name="supplier")
*/
class Supplier extends BaseEntity
{
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
* @var int
*/
protected $id;
/**
* @ORM\Column(type="string")
* @var string
*/
protected $name;
/**
* @ORM\ManyToOne(targetEntity="Region")
* @var Region
*/
protected $region;
public function getId() {
return $this->id;
}
public function getName() {
return $this->name;
}
public function getRegion() {
return $this->region;
}
public function setId($id) {
$this->id = $id;
}
public function setName($name) {
$this->name = $name;
}
/**
* @param Region $region
*/
public function setRegion($region) {
$this->region = $region;
}
.....
}
?>