2015-02-24 47 views
0

我想要感受一下laravel ORM,我有以下模型。laravel一對多得到沒有內部連接的數據

我有一個: 用戶表與 - ID,名字,姓氏 城市表 - 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

你真正擁有的是用戶和城市之間的多對多關係,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中找到關於關係的更多信息。

+0

嗨,我試過你的建議,我看到一個問題。 usercities上的內部連接發生在'id'列而不是'user_id'上。我看到下面的內部連接:選擇'城市'。*,'usercities'。'city_id' from'cities'內部連接'usercities'在'usercities'.'id' ='cities'.'id'其中'usercities'.'city_id' = 1)' – user1647708 2015-02-25 15:37:01

+0

@ user1647708你能展示你的新關係嗎?測試代碼?該查詢對於belongsToMany關係是非常錯誤的。 – patricus 2015-02-25 22:23:08