1

我正在尝试创建一个 symfony2 应用程序。该项目背后的主要思想是有一个活动,邀请了许多客人并对其进行了分类。我为所有实体创建了一个关系模型。

有4张桌子:

  1. 客人 - 被邀请的人
  2. 类别 - 他属于什么类别/类别?
  3. 活动 - 他们被邀请参加的活动
  4. Guest_Event(出席)

我总结了以下模式:

xxxxBundle\Entity\Guest:
  type: entity
  table: guest
  id:
    id:
      type: integer
      generator: { strategy: AUTO }
  fields:
    name:
      type: string
      length: 100
      nullable: false
    surname:
      type: string
      length: 100
      nullable: false   
    email:
      type: string
      length: 255
      nullable: true
    address:
      type: string
      length: 255
      nullable: true
    phone:
      type: string
      length: 10
    description:
      type: text
    created_at:
      type: datetime
    updated_at:
      type: datetime
      nullable: true   
    token:
      type: string
      length: 255
      unique: true
    is_activated:
      type: boolean
      nullable: true
  manyToOne:
    category:
      targetEntity: Category
      inversedBy: guest
      joinColumn:
        name: category_id
        referencedColumnName: id
  lifecycleCallbacks:
    prePersist: [ setCreatedAtValue ]
    preUpdate: [ setUpdatedAtValue ]

类别

xxxxBundle\Entity\Category:
  type: entity
  table: category
  id:
    id:
      type: integer
      generator: { strategy: AUTO }
  fields:
    name:
      type: string
      length: 255
      unique: true
  oneToMany:
    guests:
      targetEntity: Guest
      mappedBy: category
    attend:
      targetEntity: Attendance
      mappedBy: category

事件

xxxxxBundle\Entity\Event:
  type: entity
  table: event
  id:
    id:
      type: integer
      generator: { strategy: AUTO }
  fields:
    name:
      type: string
      length: 100
      nullable: false
    location:
      type: string
      length: 255
      nullable: true
    scheduled_at:
      type: datetime
  manyToMany:
    category:
      targetEntity: guest
      inversedBy: event
      joinColumn:
        name: event_id
        referencedColumnName: id
  • 一位客人可能属于多个类别 (manyToOne)
  • 一个类别会有很多客人(manyToOne)
  • 一位客人可能会参加许多活动 (manyToOne)
  • 一个活动可能有很多参加者(manyToMany?)
  • 出勤表(guest_event)应该是一个连接表?

我对 ORM 和学说编码有点困惑。通过 SQL 代码或 phpmyadmin 创建表对我来说似乎要容易得多,但我想走艰难的路!该文档似乎令人困惑,因为每个教程都提出了不同的建议,并且 symfony2 书中的 ORM 学说部分没有完整的示例,而是一些代码。

如何更正我的表格以包含所有规格?

4

4 回答 4

0

我强烈建议您按照 Symfony 2 官方文档的方式工作:http: //symfony.com/doc/master/book/doctrine.html

它带您逐步完成初始化数据库、制作实体、将其映射到数据库然后使用实体的过程。

您正在尝试通过阅读各种文档来理解多个概念。您的实体目录中似乎有 yaml 文件这一事实表明基本缺乏理解。

首先浏览本教程,然后添加您的真实实体。一旦你得到一些工作,这很简单。

于 2012-08-06T21:45:15.620 回答
0

我的两分钱:

一位客人可能属于多个类别

这么多客人可以属于许多类别,所以它是多对多客人方。假设拥有方是Guest

xxxxBundle\Entity\Guest:
  manyToMany:
    categories:
      targetEntity: Category
      inversedBy: guests
      joinTable:
         name: guests_categories

一个类别会有很多客人(manyToOne)

如果类别会有很多客人,为什么是多对一?许多类别可以分配给许多客人:

xxxxBundle\Entity\Category:
  manyToMany:
    guests:
      targetEntity: Guest
      mappedBy: categories

如果我理解正确,即使没有客人也可能存在类别,反之亦然,即使没有类别也可能存在客人。

对于客人/活动的关系,我会再去多对多/多对多。看看这里并问自己:我的实体的一个/多个类型可以有另一个实体的一个/多个类型?

于 2012-08-06T21:58:25.640 回答
0

我改变了主意并使用了注释,因为 yaml 让我感到困惑。

至今 :

对于来宾实体

<?php
// xxxxBundle/Entity/Guest.php

namespace xxxxBundle\Entity;

use Symfony\Component\Validator\Mapping\ClassMetadata;
use Symfony\Component\Validator\Constraints\NotBlank;
use Symfony\Component\Validator\Constraints\Email;
use Symfony\Component\Validator\Constraints\MinLength;
use Symfony\Component\Validator\Constraints\MaxLength;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="guest")
 */
class Guest
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
    * @ManyToMany(targetEntity="Category", inversedBy="guests")
    * @JoinTable(name="guests_categories")
    */
    protected $categories;

    /**
    * @ManyToMany(targetEntity="Event", inversedBy="events")
    * @JoinTable(name="guests_events")
    */
    protected $events;

    /**
     * @ORM\Column(type="string", length=30)
     */
    protected $name;

    /**
     * @ORM\Column(type="string", length=30)
     */
    protected $surname;

    /**
     * @ORM\Column(type="string", length=30)
     */
    protected $email;

    /**
     * @ORM\Column(type="string", length=100)
     */
    protected $address;

    /**
     * @ORM\Column(type="string", length=10)
     */
    protected $phone;

    /**
     * @ORM\Column(type="string", length=10)
     */
    protected $mobile;

    /**
     * @ORM\Column(type="text")
     */
    protected $description;

    /**
     * @ORM\Column(type="datetime")
     */
    protected $created_at;

    /**
     * @ORM\Column(type="datetime")
     */
    protected $updated_at;

    /**
     * @ORM\Column(type="string")
     */
    protected $token;

    /**
     * @ORM\Column(type="boolean")
     */
    protected $is_activated;

    public function __construct() {
        $this->categories = new \Doctrine\Common\Collections\ArrayCollection();
    }

    public static function loadValidatorMetadata(ClassMetadata $metadata)
    {
        $metadata->addPropertyConstraint('name', new NotBlank());
        $metadata->addPropertyConstraint('surname', new NotBlank());
        $metadata->addPropertyConstraint('email', new Email(array(
            'message' => 'I do not like invalid emails. Give me a real one!')));

        $metadata->addPropertyConstraint('phone', new MaxLength(10));
        $metadata->addPropertyConstraint('mobile', new MaxLength(10));

    }    

}

对于类别实体

<?php
// xxxxBundle/Entity/Category.php

namespace xxxxBundle\Entity;

use Symfony\Component\Validator\Mapping\ClassMetadata;
use Symfony\Component\Validator\Constraints\NotBlank;
use Symfony\Component\Validator\Constraints\Email;
use Symfony\Component\Validator\Constraints\MinLength;
use Symfony\Component\Validator\Constraints\MaxLength;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="category")
 */
class Category
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
    * @ManyToMany(targetEntity="Guest", mappedBy="categories")
    */
    protected $guests;

    /**
     * @ORM\Column(type="string", length=30)
     */
    protected $name;

    /**
     * @ORM\Column(type="text")
     */
    protected $description;

    public function __construct() {
        $this->categories = new \Doctrine\Common\Collections\ArrayCollection();
    }

    public static function loadValidatorMetadata(ClassMetadata $metadata)
    {
        $metadata->addPropertyConstraint('name', new NotBlank());

    }    

}

对于事件实体

<?php
// xxxxBundle/Entity/Event.php

namespace xxxxBundle\Entity;

use Symfony\Component\Validator\Mapping\ClassMetadata;
use Symfony\Component\Validator\Constraints\NotBlank;
use Symfony\Component\Validator\Constraints\Email;
use Symfony\Component\Validator\Constraints\MinLength;
use Symfony\Component\Validator\Constraints\MaxLength;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="event")
 */
class Event
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
    * @ManyToMany(targetEntity="Guest", mappedBy="categories")
    */
    protected $guests;

    /**
     * @ORM\Column(type="string", length=30)
     */
    protected $name;

    /**
     * @ORM\Column(type="string", length=100)
     */
    protected $location;

    /**
     * @ORM\Column(type="text")
     */
    protected $description;

    /**
     * @ORM\Column(type="datetime")
     */
    protected $scheduled_at;

    public function __construct() {
        $this->categories = new \Doctrine\Common\Collections\ArrayCollection();
    }

    public static function loadValidatorMetadata(ClassMetadata $metadata)
    {
        $metadata->addPropertyConstraint('name', new NotBlank());
        $metadata->addPropertyConstraint('location', new NotBlank());
    }    

}

我对出勤实体感到困惑。出勤实体将具有以下变量:

  • Guest_id
  • Event_id
  • Will_attend(是/否/也许)
  • 评论
  • Replied_at
  • 更新_at

我不知道哪个是主键(或主键?)。db 表不需要有单独的 Id(或没有?)。

<?php
// xxxxBundle/Entity/Attendance.php

namespace xxxxBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="attendance")
 */
class Attendance
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
    * @ManyToMany(targetEntity="Guest", mappedBy="categories")
    */
    protected $guests;

    /**
    * @ManyToMany(targetEntity="Event", mappedBy="events")
    */
    protected $events;

    /**
     * @ORM\Column(type="string", length=3)
     */
    protected $will_attend;

    /**
     * @ORM\Column(type="text")
     */
    protected $description;

    /**
     * @ORM\Column(type="datetime")
     */
    protected $replied_at;

    public function __construct() {
        $this->categories = new \Doctrine\Common\Collections\ArrayCollection();
    }

}
于 2012-08-07T08:23:48.173 回答
0

出席实体要求一个人声明他/她将参加或不参加活动。这意味着它是 oneToOne 关系,因为每个事件都必须是一个事件 - 一个人 - 一个出席回复。

解决方法是在考勤实体中更改以下代码:

/**
* @ORM\OneToOne(targetEntity="Guest")
*/
protected $guests;

/**
* @ORM\OneToOne(targetEntity="Event")
*/
protected $events;

然后运行php app/console doctrine:generate:entities​​和php app/console doctrine:schema:update --forcecrud 命令,如果您自动生成它们。现在一切正常。

于 2012-08-07T11:37:22.043 回答