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

出席者は、イベントに出席するかどうかを宣言する必要があります。これは、すべてのイベントに対して1つのイベント(1人)と1つの出席応答でなければならないため、これはoneToOne関係であることを意味します。

解決策は、出席エンティティの次のコードを変更することです。

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

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

次に、を実行しphp app/console doctrine:generate:entitiesphp app/console doctrine:schema:update --force自動的に生成する場合はcrudコマンドを実行します。これですべてが正常に機能します。

于 2012-08-07T11:37:22.043 に答える
0

Symfony 2 の公式ドキュメントを参照することを強くお勧めします: http://symfony.com/doc/master/book/doctrine.html

データベースの初期化、エンティティの作成、データベースへのマッピング、エンティティの使用のプロセスを段階的に説明します。

さまざまなドキュメントを読んで、複数の概念を理解しようとしています。エンティティ ディレクトリに yaml ファイルがあるように見えるという事実は、基本的な理解が不足していることを示しています。

最初にチュートリアルを実行してから、実際のエンティティを追加してください。いくつかのことが機能するようになると、それは非常に簡単です。

于 2012-08-06T21:45:15.620 に答える
0

私の2セント:

ゲストは複数のカテゴリに属する​​場合があります

非常に多くのゲストが多くのカテゴリに属する​​ことができるため、多対多のゲスト側になります。所有側がGuest次のとおりであると仮定します。

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

カテゴリには多くのゲストがいます (manyToOne)

カテゴリに多くのゲストがいる場合、多対なのはなぜですか? 多くのゲストに多くのカテゴリを割り当てることができます。

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

私の理解が正しければ、ゲストがいなくてもカテゴリが存在する場合があり、逆にカテゴリがなくてもゲストが存在する場合があります。

そして、ゲスト/イベントの関係については、多対多/多対多に戻ります。ここを見て自問自答してください: 私のエンティティの 1/多型は、別のエンティティの 1/多型を持つことができますか?

于 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());

    }    

}

Eventエンティティの場合

<?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());
    }    

}

出席エンティティについて混乱しています。Attendance エンティティには、次の変数があります。

  • Guest_id
  • Event_id
  • Will_attend (はい/いいえ/多分)
  • コメント
  • Reply_at
  • Updated_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 に答える