我是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")
。
我的问题是,如何在各自的模型中定义locations
和postal_codes
之间的关系? locations
表与postal_codes
表具有多对一关系。理想情况下,我希望能够做到这样的事情:$store->locations()->first()->city
。这可能吗?
答案 0 :(得分: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()魔术方法,以便动态调用所有内容。
答案 1 :(得分:0)
听起来Stores
和Postal_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。
答案 2 :(得分: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;
}