2011-04-13 78 views
0

我使用symfony 1.4.10 我有下一个情况: 用户可以创建“广告”,他可以创建一个“公司”。我的架构的一部分:表间Symfony关系

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 

所以我需要在用户把链接公司本user.So的每一个广告,我不知道该怎么做...路由 部分:

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对不起,对不起英文

回答

1

应该很容易! 去的形式,并且将其添加到配置()方法

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

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

+0

谢谢!我在Ads模型中建立关系:'公司:{onDelete:CASCADE,local:company_id,foreign:company_id,class:Companies,foreignAlias:Ads}'和公司模型'Owner:{onDelete:CASCADE,local:user_id,foreign:id,class:sfGuardUser,fore ignAlias:Companies}',当用户填写新的表格时,他可以选择所有公司,而且我不能制作,该用户只能选择他的公司(我是noob( – denys281 2011-04-13 15:12:10