doktrinde çok-çok ilişkisi

3 Cevap php

Ben bu gibi benim sistemde bazı tablolar var:

news
--id
--title
--content

video
--id
--title
--url

album
--id
--title

Şimdi, bu tablo ile bir çok-çok relatioship yapmanız gereken, ancak esnek bir şekilde. Ben aşağıda yapısı ile bağlantıları 'adında bir tablo oluşturulur:

links
--parent_entity (example: news)
--parent_id   (example: 5)
--child_entity (exmaple: video)
--child_id (example: 2)

Nasıl Doktrini kullanarak bu eşleyebilirler?

3 Cevap

Eğer uygun bir katılmak yapamaz, çünkü bu mümkün değildir. Bu durumda katılmak parent_entity ve child_entity (her satır yani farklı bir tablo katılmak gerekebilir) değere bağlıdır. (O varlık türüne bağımlı olduğundan yani) Ayrıca, nasıl doktrin hangi kayıt türü hidrat bilecek.

Eğer (bu garip olacak olsa da) sizin katıldı üzerindeki WITH yan tümcesi kullanarak bu off gibi bir şey çekmek mümkün olabilir. Örneğin, haber model Setup () yönteminde bunu yapabilirsiniz:

$this->hasMany('Links as NewsVideoLinks', array('local' => 'id', 'foreign' => 'parent_id'));

Ve Linkler modelinin kurulumunda:

$this->hasMany('Videos as videos', array('local' => 'child_id', 'foreign' => 'id'));

Sen Linkler modelinde katılır tüm kombinasyonlarını tanımlamak gerekir. Demek istediğim, bunu da child_id ve parent_id ikisini de kullanarak birçok haber ve albüm olduğunu söylemek gerekir.

Ve sonra sorguda, gibi bir şey yapmanız gerekir:

$query = Doctrine_Query::create();
$query->from('News n');
$query->innerJoin("n.NewsVideoLinks as links WITH parent_entity = 'news'");
$query->innerJoin("links.Videos as vids WITH child_entity = 'videos'");
$results = $query->execute();

Gördüğünüz gibi bu çok hantal. Ben çok her ilişki için tabloları birleştirmek oluşturmak öneriyoruz. Hala tablo katılmak her dışarı katılarak aradığınızı olacaktı.

Öğretinin documentation oldukça iyi. Sana "esnek" ile ne demek pek emin değilim ama burada Doktrin sürüm 1.2 için Many-To-Many ilişkiler için yaml yapılandırma örneğidir.

---
User:
  columns:
    id:
      type: integer(4)
      autoincrement: true
      primary: true
    username:
      type: string(255)
    password:
      type: string(255)
  attributes:
    export: all
    validate: true

Group:
  tableName: group_table
  columns:
    id:
      type: integer(4)
      autoincrement: true
      primary: true
    name:
      type: string(255)
  relations:
    Users:
      foreignAlias: Groups
      class: User
      refClass: GroupUser

GroupUser:
  columns:
    group_id:
      type: integer(4)
      primary: true
    user_id:
      type: integer(4)
      primary: true
  relations:
    Group:
      foreignAlias: GroupUsers
    User:
      foreignAlias: GroupUsers

Ben doğru veritabanı düzenini anlamak "parent_entity" ve "child_entity" Eğer id bağlamak istediğiniz tabloyu temsil eder.

Bu "teknik" yanlış bir veritabanı yapısı başka single tablo sütununa bu sütunları eşleştirmek olamaz çünkü (database normalization bakınız) .. Temelde, sizin id kullanamazsınız sütunlar şimdi belirsiz beri.

Ben yeniden düşünmek veritabanı mantığı o daha kolay kod afterwords yazmak için yapacak zorunda düşünüyorum.