【问题标题】:Symfony3 class inheritance and db relationshipsSymfony3 类继承和数据库关系
【发布时间】:2016-04-13 08:47:15
【问题描述】:

我有这三个实体

Users.php

<?php

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
* Users
*
* @ORM\Table(name="users")
* @ORM\Entity(repositoryClass="AppBundle\Repository\UsersRepository")
*/
class Users
{
/**
 * @var int
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

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

/**
 * @var string
 *
 * @ORM\Column(name="password", type="string", length=20)
 */
private $password;

/**
 * @var string
 *
 * @ORM\Column(name="phone", type="string", length=20)
 */
private $phone;

/**
 * @var string
 *
 * @ORM\Column(name="type", type="string")
 */
private $type;

/**
 * @var string
 *
 * @ORM\Column(name="name", type="string", length=255)
 */
private $name;

/**
 * @var int
 *
 * @ORM\Column(name="feedback", type="integer")
 */
private $feedback;

/**
 * @var string
 *
 * @ORM\Column(name="picture", type="blob")
 */
private $picture;

/**
 * @var int
 *
 * @ORM\Column(name="rating", type="integer", length=255)
 */
private $rating;

/**
 * @var string
 *
 * @ORM\Column(name="info", type="text")
 */
private $info;

/**
 * @var \DateTime
 *
 * @ORM\Column(name="datecreated", type="datetime")
 */
private $datecreated;


/**
 * @ORM\Column(name="is_active", type="boolean")
 */
private $isActive;
}

client.php

<?php

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
* client
*
* @ORM\Table(name="client")
* @ORM\Entity(repositoryClass="AppBundle\Repository\clientRepository")
*/
class client extends Users
{
/**
 * @var int
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * @var int
 *
 * @ORM\Column(name="numberofjobsposted", type="integer")
 */
private $numberofjobsposted;

/**
 * @var string
 *
 * @ORM\Column(name="clienttype", type="string", length=255)
 */
private $clienttype;
}

sprovider.php

<?php

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
* sprovider
*
* @ORM\Table(name="sprovider")
* @ORM\Entity(repositoryClass="AppBundle\Repository\sproviderRepository")
*/
class sprovider extends Users
{
/**
 * @var int
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * @var array
 *
 * @ORM\Column(name="interestedin", type="simple_array")
 */
private $interestedin;

/**
 * @var int
 *
 * @ORM\Column(name="numofsuccjobs", type="integer")
 */
private $numofsuccjobs;

/**
 * @var string
 *
 * @ORM\Column(name="sprovidertype", type="string", length=255)
 */
private $sprovidertype;

/**
 * @var string
 *
 * @ORM\Column(name="address", type="string", length=255)
 */
private $address;

/**
 * @var string
 *
 * @ORM\Column(name="postcode", type="string", length=255)
 */
private $postcode;
}

所以我实现了 extends 语句在 MySQL 中的 clientsprovider 表中提供了 Users 属性。棒极了。我现在想要的是建立关系,这样当我添加一个新的client 时,Usersclient 表都在 MySQL 中添加了一个新的用户/客户端,它们也有相同的 id

Users 实体中的type() 属性对于我创建的用户类型是可选的。示例:我创建了一个新的client,并且在 MySQL 的Users 表中,类型设置为“CLIENT”。

我读过this,到目前为止我认为它必须是多对多关系,但这让我很困惑。

如何在实体中建立这些关系,然后如何在控制器中使用它们?如果可能,请提供一个例子。

【问题讨论】:

    标签: php mysql entity-framework symfony


    【解决方案1】:

    我认为您对使用继承的原因感到困惑。

    这个想法是你有基类,在这种情况下是用户,并且可以扩展以提供该类的变体,在这种情况下client(你应该大写这个)和@ 987654324@.

    理想情况下,您不会有 User 表,只有另外 2 个。

    在学说中,这被称为映射超类。

    映射的超类是一个抽象或具体的类,它为其子类提供持久的实体状态和映射信息,但它本身不是实体。通常,此类映射超类的目的是定义多个实体类共有的状态和映射信息。

    the documentation here

    您可以使用关系链接属性,这是他们的示例。

    <?php
    /** @MappedSuperclass */
    class MappedSuperclassBase
    {
        /** @Column(type="integer") */
        protected $mapped1;
        /** @Column(type="string") */
        protected $mapped2;
        /**
         * @OneToOne(targetEntity="MappedSuperclassRelated1")
         * @JoinColumn(name="related1_id", referencedColumnName="id")
         */
        protected $mappedRelated1;
    
        // ... more fields and methods
    }
    
    /** @Entity */
    class EntitySubClass extends MappedSuperclassBase
    {
        /** @Id @Column(type="integer") */
        private $id;
        /** @Column(type="string") */
        private $name;
    
        // ... more fields and methods
    }
    

    【讨论】:

    • 我在这里尝试做的事情不起作用,因为我使用了 2 个注册表单,但只有一个登录表单。该表单检查Users 表是否与登录凭据匹配,如果emailpassword 与此Users 表中的条目匹配,则登录表单将重定向,具体取决于此条目中的type()表。
    • 我只是将其构建到自定义用户提供程序中并保持更标准的数据结构。
    • “自定义用户提供者”是什么意思
    • custom user provider,这样你可以让它在两个表中查找用户
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-24
    • 2012-10-06
    • 2014-04-30
    • 2010-10-27
    • 1970-01-01
    • 2010-12-01
    相关资源
    最近更新 更多