表之间的Symfony关系

时间:2011-04-13 08:18:08

标签: model-view-controller symfony1 symfony-1.4

我使用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)

我认为每个广告都可以形成一个公司的链接,但我不知道如何才能获得我所需要的公司ID。可能会在“广告”和“公司”之间添加关系?也许还有另一种方式可以建立公司链接吗? p.s抱歉英文不好

2 个答案:

答案 0 :(得分:1)

在公司模型中,在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

答案 1 :(得分:1)

应该很容易! 转到表单,并将其添加到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

相关问题