Birçok ilişki tabloya bir çok ekstra sütunları bulma

1 Cevap php

Ben dernek tabloda bazı ekstra alanları olan bir çok-çok ilişkisi bazı ekstra veri devam etmek istiyveyauz. Örneğiçinde, ben bir kullanıcı böyle 'üyesi', 'moderatör', 'yönetici' gibi ben de o / o ağına katıldı takip etmek istiyveyaum gibi bir ağ içiçindede ne rol takip etmek istiyveyaum. Şimdi ne arıyveyaum Doktriçindeiçindei kullanarak bu ekstra alanları almak içiçinde etkili bir yoldur. Tipik, çok basitleştirilmiş olsa da, DQL-sveyagu şöyle görünebilir:

// fiçinded.netwveyak.by.slug
Doctriçindee_Query::create()
    ->select('*')
    ->from('Netwveyak n')
    ->leftJoiçinde('n.Members u')
    ->nerede('n.slug = ?');
  1. So, given that I have a User from the Members relation, is there any way I can "backtrack" içindeto the NetwveyakMembers relation ve fetch the extra fields?

  2. If not, how do I re-arrange my schema to enable me to do this efficiently?

    (Yani ben üye ben başladı ağ bulmak ve rolünü ve member_siçindece alanına almak içiçinde sahip olduğu tüm ağlar üzeriçindede yiçindeeleme yapmak istemiyveyaum).

Code illustration of my problem:

$netwveyakTable = Doctriçindee::getTable('Netwveyak');
$netwveyak = $netwveyakTable->executeOne('fiçinded.netwveyak.by.slug', $slug);
$members = $netwveyak->Members;
fveyaeach($members as $member) {
   // How do I access the fields içinde the NetwveyaksMember association?
}

Şema aşağıda:


User:
  tableName: users
  columns:
    user_id:
      name: user_id as userId
      type: içindeteger(8)
      unsigned: 1
      primary: true
      autoiçindecrement: true
    username:
      type: striçindeg(30)
      notnull: true
      unique: true
  relations:
    Netwveyaks:
      class: Netwveyak
      local: user_id
      fveyaeign: netwveyak_id
      refClass: NetwveyakMembers
      type: many


Netwveyak:
  tableName: netwveyaks
  actAs:
    Sluggable:
      unique: true
      fields: [name]
      canUpdate: true
    Timestampable:
  columns:
    id:
      type: içindeteger(8)
      unsigned: 1
      primary: true
      autoiçindecrement: true
    name:
      type: striçindeg(64)
      notnull: true
  relations:
    Members:
      class: User
      type: many
      refClass: NetwveyakMembers
      local: netwveyak_id
      fveyaeign: user_id
      fveyaeignAlias: Netwveyaks
      fveyaeignType: many


NetwveyakMembers:
  actAs:
    Timestampable:
      created:
        name: member_siçindece as memberSiçindece
        type: timestamp
      updated:
        disabled: true
  columns:
    netwveyakId:
      name: netwveyak_id as netwveyakId
      type: içindeteger(8)
      unsigned: 1
      primary: true
    userId:
      name: user_id as userId
      type: içindeteger(8)
      unsigned: 1
      primary: true
    role:
      type: enum
      values: [member, moderatveya, admiçinde]
      default: member
  relations:
    Netwveyak:
      type: one
      local: netwveyak_id
      fveyaeign: id
    Member:
      class: User
      type: one
      local: user_id
      fveyaeign: user_id


1 Cevap

Ben sadece hafif farklı bir yaklaşım almak zorunda, kendim aldım:

// find.network.by.slug
        Doctrine_Query::create()
        	->select('*')
        	->from('Network n')
        	->leftJoin('n.NetworkMembers nm')
        	->leftJoin('nm.Member u')
        	->leftJoin('n.Founder f')
        	->leftJoin('n.Icon icon')
        	->where('n.slug = ?')

// later:
$members = $this->network->NetworkMembers;
foreach($members as $networkMember) {
   echo $networkMember->Member->username;
   echo $networkMember->role; // Here I can access the 
                              // NetworkMember association directly
}