Symfony отношения между таблицами - PullRequest
0 голосов
/ 13 апреля 2011

Я использую symfony 1.4.10. У меня следующая ситуация: пользователь может создать «рекламу» и создать одну «компанию».Моя часть схемы:

Ads:
  actAs:
    Timestampable: ~ 
    Sluggable:
      unique: true
      fields: [title]
      canUpdate: false
  connection: doctrine
  tableName: ads
  columns:
    ad_id: { type: integer(4), primary: true, autoincrement: true, notnull: true  }
    user_id: {type: int(4) }
    country: {type: string(255), notnull: true  }
    category_id: { type: int(4), notnull: true  }
    company: {type: string(255), notnull: true  }
    address: {type: string(255), notnull: true  }
    contact_person: {type: string(255), notnull: true  }
    phone:         { type: string(50), notnull: true }
    fax:         { type: string(50) }
    email: {type: string(255), notnull: true}
    show_in_profile: { type: boolean,notnull: true , default: false }
    title: {type: string(255), notnull: true  }
    content: {type: string(), notnull: true  }
    company: {type: string(255), notnull: true  }
    AGB: { type: boolean,notnull: true , default: false }
    active:          { type: boolean,notnull: true , default: 0 }
    expires_at:   { type: timestamp, notnull: true }
  relations:
    Owner:       { onDelete: CASCADE, local: user_id, foreign: id, class: sfGuardUser }
    Bookmark:    {                    local: ad_id, foreign: user_id, class: sfGuardUser, refClass: Bookmarks }
    Categories:  { onDelete: CASCADE, local: ad_id, foreign: category_id }
    Images:      {                    local: ad_id, foreign: ad_id, type: many, class: Images }

Companies:
  actAs:
    Timestampable: ~
    Sluggable:
      unique: true
      fields: [company]
      canUpdate: false
  connection: doctrine
  tableName: companies
  columns:
    company_id: { type: integer(4), primary: true, notnull: true, autoincrement: true }
    user_id:  {type: int(4)  }
    category_id:  {type: int(4), notnull: true  }
    company: {type: string(255), notnull: true  }
    address: {type: string(255), notnull: true  }
    contact_person: {type: string(255), notnull: true  }
    phone:         { type: string(50), notnull: true }
    fax:         { type: string(50) }
    email: {type: string(255), notnull: true}
    url:  { type: string(50) }
    about: {type: string(), notnull: true}
    country: {type: string(255), notnull: true}
    active:          { type: boolean, default: 0 }
    has_company:        { type: boolean, default: 1 }
  relations:
    Owner:       { onDelete: CASCADE, local: user_id, foreign: id, class: sfGuardUser }
    Images_companies:      {                    local: company_id, foreign: company_id, type: many, class: Images_companies }
    Categories:  { onDelete: CASCADE, local: company_id, foreign: category_id }

sfGuardUserProfile:
  connection: doctrine
  tableName: sf_guard_user_profile
  columns:
    id:            { type: integer(4), primary: true, autoincrement: true }
    user_id:       { type: integer(4), notnull: true }
    salutation:    { type: string(10), notnull: true }
    first_name:    { type: string(30), notnull: true }
    last_name:     { type: string(30), notnull: true }
    country:       { type: string(255), notnull: true }
    postcode:      { type: string(10) , notnull: true }
    city:          { type: string(255), notnull: true }
    address:       { type: string()   , notnull: true }
    phone:         { type: string(50) }
    email:         { type: string(255), notnull: true }
    validate:      { type: string(17) }
    banned:        { type: boolean, default: 0 }
    payed_until:   { type: datetime, notnull: true}
  relations:
    User:
      class: sfGuardUser
      local: user_id
      foreign: id
      type: one
      foreignType: one
      foreignAlias: Profile
      onDelete: CASCADE

Поэтому мне нужно в каждой рекламе пользователя поставить ссылку на компанию этого пользователя. Так что я не знаю, как это сделать ... Часть маршрутизации:

ads:
  url: /:sf_culture/account/ads/:action/*
  param: { module: ads }
  requirements:
    sf_culture: (?:de|en|ru)
companies:
  url: /:sf_culture/account/company/:action/*
  param: { module: companies }
  requirements:
    sf_culture: (?:de|en|ru)

Я думаю, что в каждом объявлении можно сформировать ссылку на компанию, но я не знаю, как мне получить идентификатор компании, который мне нужен. Вероятно, добавить отношения между «Реклама» и «Компания»? Может есть другой способ сделать ссылку на компанию?ps извините за ма плохой английский

Ответы [ 2 ]

1 голос
/ 14 апреля 2011

это должно быть легко!перейдите к форме и добавьте ее в метод configure ()

public function configure() {
        parent::configure();
        unset(
                $this['company_id'],
        );
}

И, когда форма сохранена, обработайте это в действии:

if ($this->form->isValid()) {               
    $user_id = // get user_id of authenticated user
    $user = // get user obj
    $company_id = $user->Companies->id;
    $temp_ad = $this->form->getObject();
    $ad->company_id = $company_id ;
                $this->form->save();
}

Кроме того, в ваших объявленияхмодель, отношение для компаний, foreign_id должно быть просто id

1 голос
/ 13 апреля 2011

В модели компаний укажите unique index на user_id.Таким образом, пользователь может создать только одну компанию. Также, в модели компаний,

Owner:       { onDelete: CASCADE, local: user_id, foreign: id, class: sfGuardUser, foreignAlias: Company }

Теперь в коде вы всегда можете сделать $user->Company, чтобы получить основную компанию пользователя

Создать ссылкуКомпании в модели объявлений

Company:       { onDelete: CASCADE, local: company_id, foreign: id, class: Company, foreignAlias: Ads }

Теперь вы можете получить все объявления для компании как $company->Ads или для пользователя $user->Company->Ads

...