雄辩有多重关系

时间:2013-07-18 17:15:12

标签: php orm laravel laravel-4 eloquent

我是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。这可能吗?

3 个答案:

答案 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)

听起来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

答案 2 :(得分:0)

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

修改您的位置表,以包含idimageable_idimageable_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;
}