2013-07-18 79 views
0

我是Laravel和ORM的新手,所以这可能是一个非常基本的概念,我错过了。我有三个表,我试图用Laravel 4的Eloquent ORM定义一个关系。这里的简装表定义:与多重关系的雄辩


ID(PK)

postal_codes
ID(PK)
POSTAL_CODE
城市
状态
国家

位置
ID(PK)
STORE_ID(FK => stores.id)
postal_code_id(FK => postal_codes.id)
* 附加位置特定字段,诸如地址,电话#,等

stores表有一个与locations表一对多的关系,这样我就可以在位置模型中使用的存储模型$this->hasMany("Location")$this->belongsTo("Store")

我的问题是,如何定义在各自的车型locationspostal_codes之间的关系? locations表格与postal_codes表格具有多对一的关系。理想情况下,我想能够做到这样的事情:$store->locations()->first()->city。这可能吗?

回答

1

难道你不找是这样的:

class Locations 
{ 
    public function city() 
    { 
     return $this->belongsTo('PostalCode'); 
    } 
} 

所以,现在你可以调用$store->locations()->first()->city。这将返回一个POSTALCODE模型,如果你想只返回城市:

public function getCity() 
{ 
    return $this->city()->city; 
} 

然后调用$store->locations()->first()->getCity()

你可以走得更远,并创建一个__get()魔术方法,因此动态调用一切。

+0

谢谢,这绝对是处理它的正确方法。我不知道为什么我把它变得比需要的复杂。 – Jeff

0

听起来好像你在StoresPostal_Codes之间有多对多的关系。这将证明这种方式在Laravel:

class Store extends Eloquent { 
    public function postal_codes() { 
     $this->belongsToMany('Postal_Code', 'location'); 
    }   
} 

class Postal_Code extends Eloquent { 
    public function stores() { 
     $this->belongsToMany('Store', 'location'); 
    }   
} 

欲了解更多信息,请访问这个链接:Laravel Many-to-Many Relationships

+0

我认为这是正确的,但我的透视表(我所称为“位置”)具有除了外键几等领域。我浏览了文档,但没有看到我将如何去处理这个问题。 – Jeff

+0

请查看bro:[Laravel Docs:Working with Pivot Tables](http://laravel.com/docs/eloquent#working-with-pivot-tables) – searsaw

+0

其实,我认为他需要的是多态关系。我会更改位置表以包含id,imageable_id,imageable_type,然后是该表的其余misc字段。在相同的文档中查看searsaw链接,关于多态关系的部分。 – user1669496

0

我相信你正在寻找一个多态关系。

修改您的位置表以包含id,imageable_id,imageable_type,然后您需要的任何其他位置信息。 imageable_id字段将包含您在其各自表格中查找的任何ID,imageable_type将是该表格的该型号的名称。

您的模型......

Class Location extends Eloquent 
{ 
    public function imageable() 
    { 
     return $this->morphTo(); 
    } 
} 

Class Store extends Eloquent 
{ 
    public function locations() 
    { 
     return $this->morphMany('Location','imageable'); 
    } 
} 

Class PostalCode extends Eloquent 
{ 
    public $table = 'postal_codes'; 
    public function locations() 
    { 
     return $this->morphMany('Location','imageable'); 
    } 
} 

而现在,它是可能的检索所有的商店或邮政编码的东西位置的像

$store = Store::find(1); 
foreach($store->locations as $location) 
{ 
    // 
    echo $location->city; 
} 

$postalCode = PostalCode::find(1); 
foreach($postalCode->locations as $location) 
{ 
    // 
    echo $location->city; 
} 
+0

我不认为这是多态的,因为一个位置没有一个邮政编码或商店的某一关联。它与一个商店和一个邮政编码相关联。多态关系是两个不同的模型与另一个模型相关联的时候。 – searsaw

+0

好吧,这更有意义。我认为商店和邮政编码没有关系,但都有位置。如果不可能只有一张位置信息表与城市,州,国家,地址,邮政编码,电话号码,等等,让它变得非常简单,我相信阿拉丁有你在找的东西。 – user1669496