2016-04-13 60 views
0

我有這3個entititesSymfony3類的繼承和db關係

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

type()Users實體中的屬性我想對於我創建的用戶類型是可選的。示例:我創建了一個新的client,並在MySQL的Users表中將該類型設置爲「客戶端」。

我看了this,到目前爲止我認爲它必須是ManyToMany關係,但這對我來說很困惑。

如何使這些關係在實體中,然後如何在控制器中使用它們?如果可能的話,請舉個例子。

回答

0

我認爲你對使用繼承的原因感到困惑。

的想法是,你有基類,在這種情況下用戶,並且可以被擴展以提供類的變化,在這種情況下client(您應該利用此)和sprovider

理想情況下,你不會有一個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 
} 
+0

我想在這裏做什麼不會工作,因爲我使用2註冊表單,但只有一個登錄表單。表單檢查用戶表是否與登錄憑證相匹配,如果email和password與該用戶表中的條目相匹配,登錄表單將根據此條目的type()重定向在桌子裏。 –

+0

我只是建立一個自定義用戶提供程序,並保持一個更標準的數據結構。 – DevDonkey

+0

你是什麼意思的「自定義用戶提供商」 –