2017-09-03 116 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