2013-12-09 1 views
2

Я строю свое первое приложение с symfony2. Я хочу создать этот макет базы данных с сущностями.Symfony2 отношения сущностей с colum

# документ

document_id | INT | AI | PK

document_name | STRING

услуги | ОТНОШЕНИЕ MANY2MANY

...

# сервис

service_id | INT | AI | PK

service_name | STRING

...

* # _table_document_service *

document_id | INT

service_id | INT

количество | INT | ПО УМОЛЧАНИЮ 1

Невозможно создать документ и службу сущностей. Для того, чтобы создать связь между документом и обслуживанием я буду использовать ManyToMany-Relation, как этот:

/** 
* @ORM\ManyToMany(targetEntity="Services") 
* @ORM\JoinTable(name="_table_document_service", 
*  joinColumns={@ORM\JoinColumn(name="document_id", referencedColumnName="id")}, 
*  inverseJoinColumns={@ORM\JoinColumn(name="service_id", referencedColumnName="id")} 
*) 
*/ 
private $services; 

Но я хочу, чтобы в джойна столе также должна быть столбец называется суммой. Как я могу это сделать?

ответ

1

Учитывая, что вы хотите добавить дополнительные поля в отношение, тогда это уже не отношение, но ясно - «конструктивно» говорящий - объект ассоциации.

Следовательно, то, что вы хотите в таблице «таблица службы документ» что-то вроде этого

документа ------- Таблица службы документа -------- служба

Doing так значит 2 вещи:

Многие в один ассоциации между документами ---- службы Таблица документа и таблицы службы документа -------- службы

Этакий «Композит ключ» в таблице документа на основе этих ассоциаций (ваш основной ключ en становится составной частью отношений между этими объектами.

Вот несколько примеров: as you can see in the official doctrine 2 documentation вы можете делать ассоциации на основе многотонов с составными ключами, как следует.

EDIT: вот несколько кусков кода, пытаясь следовать вашему примеру.

use Doctrine\ORM\Mapping\Entity, Doctrine\ORM\Mapping\Id, Doctrine\ORM\Mapping\Column, Doctrine\ORM\Mapping\ManyToOne, Doctrine\ORM\Mapping\OneToMany; 

/** @Entity */ 
class Document 
{ 
    /** @Id @Column(type="integer") @GeneratedValue */ 
    protected $id; 

    /** @OneToMany(targetEntity="OrderItem", mappedBy="document") */ 
    protected $tableDocumentService; 

    /** your attributes here, it isn't important here **/ 

    public function __construct(Customer $customer) 
    { 
     $this->tableDocumentService = new ArrayCollection(); 
     // some logic here if you need it 
    } 
} 

/** @Entity */ 
class Service 
{ 
    /** @Id @Column(type="integer") @GeneratedValue */ 
    protected $id; 

    /** @Column(type="string) *§ 
    protected $name; 
} 

/** @Entity */ 
class TableDocumentService 
{ 
    /** @Id @ManyToOne(targetEntity="Document") */ 
    protected $document; 

    /** @Id @ManyToOne(targetEntity="Service") */ 
    protected $service; 

    /** @Column(type="integer") */ 
    protected $amount = 1; 

} 

Я могу добавить, что, я думаю, вы можете добавить тоже другой OneToMany ассоциации в классе обслуживания, как док сделал для объекта Document, что-то вроде

/** @OneToMany(targetEntity="OrderItem", mappedBy="service") */ 
protected $tableDocumentService; 
1

ответа @YoannCh является правильно, но правильно аннотации

для сущности документа:

/** 
* @ORM\Entity 
* @ORM\Table(name="Document") 
*/ 
class Document 
{ 
    /** 
    * @ORM\Column(type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue 
    */ 
    private $id; 

    /** 
    * @ORM\Column(type="string") 
    */ 
    private $name; 

    /** 
    * @ORM\OneToMany(
    * targetEntity="DocumentService", mappedBy="documentId") 
    */ 
    private $documentService; 
    //... 

служба Ent ность является:

/** 
* @ORM\Entity 
* @ORM\Table(name="service") 
*/ 
class Service 
{ 
    /** 
    * @ORM\Column(type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue 
    */ 
    private $id; 

    /** 
    * @ORM\Column(type="string") 
    */ 
    private $name; 

    /** 
    * @ORM\OneToMany(
    * targetEntity="DocumentService", mappedBy="serviceId", 
    * ) 
    */ 
    private $documentService; 
    // ... 

DocumentService Entity (Join таблицы между документом и услуги) является:

/** 
* @ORM\Entity 
* @ORM\Table(name="document_service") 
*/ 
class DocumentService 
{ 
    /** 
    * @ORM\ManyToOne(targetEntity="Document", inversedBy="documentService") 
    * @ORM\JoinColumn(name="document_id", referencedColumnName="id") 
    */ 
    private $documentId; 

    /** 
    * @ORM\ManyToOne(targetEntity="Service", inversedBy="documentService") 
    * @ORM\JoinColumn(name="company_id", referencedColumnName="id") 
    */ 
    private $serviceId; 

    /** 
    * @ORM\Column(type="integer", name="amonut") 
    */ 
    private $amonut; 

это article обсудить ту же проблему, вы спросили с примером

+1

Аннотации только зависит от Вашего импорта (используйте заявления). Если вы импортируете аннотации ORM, следуйте «Использовать Doctrine \ ORM \ Mapping как ORM;», тогда ваша точность верна. Если вы импортируете их отдельно, «используйте , используйте Doctrine \ ORM \ Mapping \ Entity, Doctrine \ ORM \ Mapping \ Id, Doctrine \ ORM \ Mapping \ Column, Doctrine \ ORM \ Mapping \ ManyToOne, Doctrine \ ORM \ Mapping \ OneToMany; 'для более точного импорта, мой ответ работает хорошо. –

 Смежные вопросы

  • Нет связанных вопросов^_^