Doctrine - 数据库表示

时间:2018-04-19 10:31:42

标签: mysql sql zend-framework doctrine-orm zend-framework3

我几乎尝试了所有尝试创建代表我的数据库架构并且仍然存在整页错误的实体。如果有人能给我一些启示,我会很感激。

基本上我们有2个注册表,一个用于品牌,一个用于影响者。在每种形式中,我们要求用户信息加上具体信息,具体取决于您所在的表格页面。

DATABASE SCHEMA:

  • 角色(此表已填充了“人员类型”,无论是管理员,品牌还是影响者)

id | 名字

  • 用户(此表包含人员的一般信息,电子邮件和密码将用于登录)

id | id_role FK | 名字| 电话| 电子邮件| 密码| created_at | 状态

  • 品牌(此表包含使用品牌形式进行注册的品牌的具体信息)

id | user_id FK | name_brand | position_id | email_brand | nif_brand | name_firma | phone_brand |

  • 职位(此表已填入我们显示的职位,例如CEO)

id | 名称

  • 区(此表已填入我们显示要选择的区域,例如NJ)

id | 名称

  • 影响者(此表包含使用该品牌形式进行注册的影响者的具体信息)

id | user_id FK | 姓氏| date_of_birth | email_brand | district_id FK | 性别

主要观点:

我已经尝试过使用Doctrine注释但仍然没有为我工作,不确定是不是因为我是新手,或者我没有正确构建数据库/实体,甚至管理一个实体及其与数据库的关联

这个想法是一个用户/个人可以是一个品牌或影响者。这是通过链接到角色表的role_id实现的。例如,如果我是品牌形式并尝试添加我的信息,它将在users表中添加个人信息,并使用role_id 2链接到角色表。然后,使用用户PRIMARY KEY将给定的特定品牌信息插入表BRAND中以链接两个表。 (不确定,如果在这里有错误,也许用户应该通过角色表并从该表到特定的表,这不是我现在正在做的事情)。在BRAND表中,我要求它的信息来自POSITION SELECT,其格式为FK position_id,并将其链接到表POSITION。

影响者会发生一个不同但相似的事情,它将选择他的区域,然后我使用该area_id链接区域表。

问题始终是我需要在实体中定义的与教义和属性的外键关联。我已经没有声明外键了,因为我知道doctrine使用对象来处理内部的FK关系,但不能使它工作..

我很感激你们所有人可以分享的帮助。 谢谢。

1 个答案:

答案 0 :(得分:1)

我认为您正在尝试手动执行Doctrine可以通过继承提供的功能。

一个小设置,应该与您对您尝试做的事情的描述一起使用。

通用用户设置

/**
 * @ORM\Table(name="users")
 * @ORM\Entity
 *
 * @ORM\MappedSuperclass

 * @ORM\InheritanceType("JOINED")
 * @ORM\DiscriminatorColumn(name="discr", type="string")
 */
class User 
{
    /**
     * @var int
     * @ORM\Id
     * @ORM\Column(name="id", type="integer")
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    protected $id;

    /**
     * @var string
     * @ORM\Column(name="name", type="string", length=255, nullable=false, unique=true)
     */
    protected $name;

    /**
     * @var Position
     * @ORM\OneToOne(...)
     */
    protected $position; // TODO

    // getters/setters & other properties
}

品牌用户

/**
 * @ORM\Table(name="brands")
 * @ORM\Entity
 */
class BrandUser extends User
{
    /**
     * @var string
     * @ORM\Column(name="specific_brand_property", type="string", length=255, nullable=false, unique=false)
     */
    protected $specificBrandProperty;

    // getters/setters & other properties
}

这个小设置应该已经为您提供了2个实体对象:UserBrandUser,其中后者扩展了第一个。

BrandUser的主键是User的外键,User的要求也是BrandUser的要求。

如果您正在使用Fieldset和InputFilter类,则可以让BrandUserFieldset扩展Fieldset以便在您的表单中使用(例如下面的more info并在我的一个repo中使用#{} 39;关于这个问题)

class UserFieldset
{
    public function init()
    {
        parent::init();

        $this->add([
            'name' => 'id',
            'required' => true,
            'type' => Hidden::class,
        ]);

        $this->add([
            'name' => 'name',
            'required' => true,
            'type' => Text::class,
            'options' => [
                'label' => 'Name',
            ],
        ]);

        $this->add([
            'name' => 'position',
            'required' => true,
            'type' => ObjectSelect::class,
            // other properties
        ]);
    }
}

BrandUser

的扩展
class BrandUserFieldset extends UserFieldset
{
    public function init()
    {
        parent::init(); // <-- adds id, name, position

        $this->add([
            'name' => 'specificBrandProperty',
            'required' => true,
            'type' => Text::class,
            'options' => [
                'label' => 'Name',
            ],
        ]);
    }
}

想要添加一些命令,他们可能会帮助你。我的设置要求我使用./vendor/bin/doctrine-module作为前缀命令,将您的设置所需的内容添加到以下内容中:

  • orm:validate-schema - 将检查您的Doctrine Annotation是否存在错误。还将返回它找到的任何错误(语法和逻辑)
  • orm:schema-tool:update - 用于创建/更新数据库架构的命令
    • flag -f - 将:update执行为真实
    • 标记--dump-sql将使:update 执行,但将SQL转储到您的终端
    • 标记-f--dump-sql可以合并
  • orm:mapping:describe “\Full\Namespace\To\Entity” - 显示Doctrine对特定实体的所有信息 - 包括关系,关系映射,鉴别器,扩展(子)和父实体等等

另外,我前段时间遇到类似问题的look at a solution