2017-09-03 41 views
0

我在嘗試從數據庫獲取記錄時遇到了一些麻煩。這裏的表模式:Laravel嵌套關係其中5.5返回所有記錄

users 
-------------- 
id 
username 
password 
email 

divisions 
-------------- 
id 
name 

employee 
-------------- 
name 
birth_date 
status 
class 
division_id 
user_id 

projects 
-------------- 
id 
title 
body 
user_id 

因此,對於關係的解釋:

relationship

好吧,我想基於表員工用下面的代碼division_id獲取項目:

# query code 
$division_id = 10; 

$items = Project::with(['user.employee.division' => function($query) use ($division_id) { 
      $query->where('id', $division_id); 
}])->get(); 

我已將所需的belongsTo,hasMany或hasOne添加到模型中。

# User.php 
class User extends Authenticatable 
{ 
    public function employee() 
    { 
     return $this->hasOne('App\Employee', 'user_id'); 
    } 
    public function projects() 
    { 
     return $this->hasMany('App\Project', 'user_id'); 
    } 
} 

# Division.php 
class Division extends Model 
{ 
    public function employee() 
    { 
     return $this->hasMany('App\Employee', 'division_id'); 
    } 
} 

# Employee 
class Employee extends Model 
{ 
    public function user() 
    { 
     return $this->belongsTo('App\User', 'user_id'); 
    } 

    public function division() 
    { 
     return $this->belongsTo('App\Division', 'division_id'); 
    } 
} 

# Project.php 
class Project extends Model 
{ 
    public function user() 
    { 
     return $this->belongsTo('App\User', 'user_id'); 
    } 
} 

那麼,什麼問題?

下面是這個事情,當我運行查詢代碼時,我得到所有的記錄和關係的工作關係返回null。

如果有人認爲我的代碼不對,請賜教。

謝謝。

+0

什麼輸出你期待,因爲它規定給我的所有用戶和他們的項目下的分工10. –

+0

當我運行查詢代碼, division_id的where子句不起作用。結果返回所有部門下的用戶及其項目,不會被過濾。這是否有可能因爲環境? – DefaultB2

回答

0

所以經過一些挖掘,我找到了答案。查詢代碼應更改爲whereHas

# query code 
$division_id = 10; 

$items = App\Project::whereHas('user.employee.division', 
    function($query) use ($division_id) { 
     $query->where('divisions.id', $division_id); 
    }) 
    ->with(['user.employee.division']) // N+1 problem 
    ->get(); 

參考:Laravel 5.3 Constraining Eager Loads not working