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")在 Stores 模型和$this->belongsTo("Store")Location 模型中使用。

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

4

3 回答 3

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() 魔术方法,以便它动态调用所有内容。

于 2013-07-18T20:32:45.717 回答
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;
}
于 2013-07-18T20:29:48.857 回答
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 多对多关系

于 2013-07-18T17:47:05.047 回答