onları çalışması için nasıl symfony + doktrin + kalıtım,?

2 Cevap php

Ben Symfony ile çalışmaya başlıyorum, ben miras ile ilgili bazı belgeleri buldum. Ama aynı zamanda Doktrin tüm mirasını herhangi bir iyi işler beni şüphe, hangi yapmak, this discouraging article bulundu ...

Has anyone find a smart solution for inheritance in Symfony+Doctrine?

Örnek olarak, ben zaten böyle bir veritabanı şey yapılandırdık:

CREATE TABLE `poster` (
  `poster_id` int(11) NOT NULL AUTO_INCREMENT,
  `user_name` varchar(50) NOT NULL,
  PRIMARY KEY (`poster_id`),
  UNIQUE KEY `id` (`poster_id`),
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;

CREATE TABLE `user` (
  `user_id` int(11) NOT NULL,
  `real_name` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`user_id`),
  UNIQUE KEY `user_id` (`user_id`),
  CONSTRAINT `user_fk` FOREIGN KEY (`user_id`) REFERENCES `poster` (`poster_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Bu itibaren, Doktrin, bu "schema.yml" oluşturulur:

Poster:
  connection: doctrine
  tableName: poster
  columns:
    poster_id:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: true
      autoincrement: true
    user_name:
      type: string(50)
      fixed: false
      unsigned: false
      primary: false
      notnull: true
      autoincrement: false
  relations:
    Post:
      local: poster_id
      foreign: poster_id
      type: many
    User:
      local: poster_id
      foreign: user_id
      type: many
    Version:
      local: poster_id
      foreign: poster_id
      type: many
User:
  connection: doctrine
  tableName: user
  columns:
    user_id:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: true
      autoincrement: false
    real_name:
      type: string(50)
      fixed: false
      unsigned: false
      primary: false
      notnull: false
      autoincrement: false
  relations:
    Poster:
      local: user_id
      foreign: poster_id
      type: one

Doktrin otomatik oluşturulan formları ile bu yapı için kullanıcı oluşturma çalışmıyor.

Herhangi bir ipucu takdir edilecektir.

2 Cevap

Uzak somut miras kalmak: birkaç ay sütun toplama ve somut miras ikisini de kullanarak bir proje üzerinde çalıştıktan sonra ben tek bir şey söyleyebilirim! Gerçekten.

Diyelim ki 3 tablo var diyelim: Medya ve Medya devralan Video / Ses. Gibi bir şey yapmak mümkün beklediğiniz:

Doctrine_Query::create()
    ->from('Media m')
    ->execute();

Peki somut miras ile çalışmaz. Bu sadece değersiz ve model devralmasını yöntemleri dışında, neredeyse hiçbir pratik kullanımı vardır.

Öte yandan, kolon toplama ile, Media masa bir "tip" sütunu otomatik olarak eklenecek sahip olacak, ve bu gibi şeyler size sağlayacaktır:

Doctrine_Query::create()
    ->from('Video v')
    ->execute();

Video nesne koleksiyonu dönecektir Hangi. Ama aynı zamanda bu yapabilirdi:

Doctrine_Query::create()
    ->from('Media m')
    ->execute();

Ve Video ve Ses nesneleri karışık sonuç alırsınız.

Anyway you should check the doctrine documentation. But be careful as inheritance and doctrine can rapidly become troublesome.

Aşağıdaki gibi 'Ses' verilerini demek gelen 'Video' verilerini ayrı ama yine de 'medya' depolamak için aynı tablo kullanmak bir çözümdür:

Media:
  columns:
    name: { type: string(255), notnull: true }
    description: { type: text }

Video:
  inheritance:
    type: column_aggregation
    keyField: type
    keyValue: video

Audio:
  inheritance:
    type: column_aggregation
    keyField: type
    keyValue: audio

VideoData:
  columns:
    resolution_x: { type: integer, notnull: true }
    resolution_y: { type: integer, notnull: true }
  relations:
    Video: { foreignAlias: Data, onDelete: CASCADE }

AudioData:
  columns:
    sample_rate: { type: integer, notnull: true }
  relations:
    Audio: { foreignAlias: Data, onDelete: CASCADE }

Bunun gibi bir şey ... Eğer bir tablodaki tüm 'Medya' depolamak ve DuoSRX tarafından yukarıda bahsedilen ve hala o tablodaki ilgisiz veri olmadığı gibi getirebilir yolu. Tabii bunu katılmak zorunda, ama endeksli yabancı anahtarlar ile tüm bu bir performans isabet olmamalıdır.