Symfony2 - 数据库表关系

时间:2015-03-11 18:13:53

标签: symfony

我正在开发一个应用程序并且设置得很好。我有一个Alert实体,它采用以下形式。

/**
 * Alert
 *
 * @ORM\Table(name="alert")
 * @ORM\Entity(repositoryClass="Nick\AlertBundle\Repository\AlertRepository")
 *
 */
class Alert
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="search_command", type="string", length=256, nullable=false)
     */
    private $searchCommand;

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

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="last_updated", type="datetime", nullable=false)
     */
    private $lastUpdated;

    /**
     * @var boolean
     *
     * @ORM\Column(name="is_deleted", type="boolean", nullable=false)
     */
    private $isDeleted;

    /**
     * @var string
     *
     * @ORM\Column(name="alert_status", type="string", length=11, nullable=false)
     */
    private $alertStatus;

    /**
     * @ORM\OneToMany(targetEntity="Nick\AlertBundle\Entity\BookingClass", mappedBy="availabilityAlert")
     */
    private $bookingClass;

    /**
     * @ORM\OneToMany(targetEntity="Nick\AlertBundle\Entity\Pseudos", mappedBy="availabilityAlert")
     */
    private $pseudo;

    /**
     * @ORM\OneToMany(targetEntity="Nick\AlertBundle\Entity\FlightNumbers", mappedBy="availabilityAlert")
     */
    private $flightNumbers;

    /**
     * @ORM\OneToMany(targetEntity="Nick\AlertBundle\Entity\Availability", mappedBy="availabilityAlert")
     */
    private $availability;

    /**
     * Constructor
     */
    public function __construct()
    {
        $this->bookingClass = new ArrayCollection();
        $this->pseudo = new ArrayCollection();
        $this->flightNumbers = new ArrayCollection();
        $this->availability = new ArrayCollection();
    }

    //other methods
}

所以我有这个应用程序工作,但现在我已经决定添加一个登录系统。现在,每个警报都应该与用户相关联 - 用户可以拥有无​​多个警报。

所以我创建了我的用户类并设置了所有安全性。该实体看起来像

/**
 * User
 *
 * @ORM\Table(name="user_table")
 * @ORM\Entity()
 *
 */
class User implements UserInterface
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

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

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

    //other functions
}

那么将警报与用户关联的最佳方法是什么?我应该像我在Alert类中与其他实体一样进行设置吗?我应该在用户类中添加一个Alert变量,它是一个警报的数组集合吗?

真的只是寻求一些建议如何最好地处理这个。

由于

2 个答案:

答案 0 :(得分:1)

除了在ManyToOne实体或Alert中使用ManyToMany关联之外,我还没有真正看到任何其他解决方案,以防一个警报必须与超过1个用户相关联。

  

我应该在用户类中添加一个Alert变量,它是一个警报的数组集合吗?

哎呀,为什么不呢?这样,您就可以轻松获得已加入警报的用户。

答案 1 :(得分:1)

是的,您应该在用户实体中添加一对多关系并与警报实体链接,并在警报实体中以多对一的方式指向用户实体

class User
{


    /**
     * @ORM\OneToMany(targetEntity="Alert", mappedBy="user")
     */
    protected $alerts;

    public function __construct()
    {
        $this->alerts= new ArrayCollection();
    }

    //... other getters amd setters
}

class Alert
{
    // ...

    /**
     * @ORM\ManyToOne(targetEntity="User", inversedBy="alerts")
     * @ORM\JoinColumn(name="user_id", referencedColumnName="id")
     */
    protected $user;
}

Reference