我试图了解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"}]]
我或许可以使用内连接,但我想看看是否有另一种方法可以检索数据,为我安全地填充数据。
答案 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中找到有关关系的更多信息。