覆盖连接表上的鉴别器映射

时间:2021-06-27 23:49:42

标签: doctrine-orm doctrine

该项目使用多个用户登录(管道工、建筑商),每个实体的相关信息保存在各自的表中。下面提供了它们的结构。

我们一直在为供应商存储信息,现在已经收集了数百个条目。供应商现在需要登录才能访问系统。

带有鉴别器映射的当前流程是它在用户表中创建一个条目,然后保存在相应的用户类型表中,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;
    }

    .....
}
?>

0 个答案:

没有答案
相关问题