Symfony3类继承和数据库关系


Symfony3 class inheritance and db relationships

我有这3个实体

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

CCD_ 10实体i中的CCD_。示例:我创建了一个新的client,在MySQL的Users表中,类型设置为"CLIENT"。

我读到这篇文章,到目前为止,我认为这一定是ManyToMany的关系,但这让我很困惑。

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

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

这个想法是,您有一个基类,在本例中是User,它可以扩展以提供该类的变体,在本案中是client(您应该大写this)和sprovider

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

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

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

请参阅此处的文档

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

<?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
}