laravel一对多获取没有内连接的数据

时间:2015-02-24 17:28:48

标签: laravel laravel-5

我试图了解laravel ORM并且我有以下模型。

我有一个: 用户表with-id,firstname,lastname 城市表 - id,名称 usercity表 - user_id,city_id

usercity表跟踪用户访问过的城市。

我在城市模型中添加了以下内容:

    public function usercity()
    {
            return $this->hasMany('App\UserCity');
    }

用户模型中的另一个功能

    public function usercity()
    {
            return $this->hasMany('App\UserCity');
    }

我还为UserCity添加了一个模型,并在那里添加了以下功能。

    public function city()
    {
            return $this->belongsTo('App\City');
    }
    public function user()
    {
            return $this->belongsTo('App\User');
    }

现在,目标是检索用户访问过的所有城市。我使用了以下功能。

   $usercities = User::where('id','=',1)->first()->usercity()->get();

这在检索user_id和city_id的意义上有效。 我还需要做些什么才能获得城市表中的所有字段? 目前的回应:

[[{"user_id":"1","city_id":"1"},{"user_id":"1","city_id":"2"},{"user_id":"1","city_id":"3"},{"user_id":"1","city_id":"4"}]]

我或许可以使用内连接,但我想看看是否有另一种方法可以检索数据,为我安全地填充数据。

1 个答案:

答案 0 :(得分:0)

您真正拥有的是用户和城市之间的多对多关系,其中usercity表是数据透视表。 Laravel使用BelongsToMany关系来实现这一点。您需要进行一些更改才能使其正常工作。

在您的城市模型中:

public function users() {
    return $this->belongsToMany('App\User', 'usercity');
}

在您的用户模型中:

public function cities() {
    return $this->belongsToMany('App\City', 'usercity');
}

您可以摆脱UserCity模型。通常没有理由需要数据透视表的模型。

可能需要更新usercity表以添加id字段作为主键。但是,如果没有它,我没有尝试过,所以它可能会像你拥有它一样工作。此外,如果需要,可以将表重命名为city_user以符合Laravel约定,然后您不需要在关系定义中指定表名。

一旦您的关系设置正确,您就可以通过用户的城市关系访问用户的城市,并且您可以通过城市的用户关系访问城市的用户。例如:

// all of the cities visited by user 1
$user = User::find(1);
$usercities = $user->cities;

// all of the users that have visited city 1
$city = City::find(1);
$cityusers = $city->users;

您可以在文档here中找到有关关系的更多信息。

相关问题