【问题标题】:Laravel Nested Relationship Where 5.5 Return All RecordsLaravel 嵌套关系 where 5.5 返回所有记录
【发布时间】:2018-02-11 22:04:56
【问题描述】:

我在尝试从数据库中获取记录时遇到了一些麻烦。这是表架构:

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

好的,我正在尝试使用以下代码根据 employee 表上的 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。

如果有人认为我的代码错了,请赐教。

谢谢。

【问题讨论】:

  • 您所期望的输出为我提供了第 10 部门下的所有用户及其项目。
  • 当我运行查询代码时,divide_id 上的 where 子句不起作用。结果返回所有部门下的用户及其项目,未经过滤。可能是因为环境?

标签: laravel


【解决方案1】:

所以经过一番挖掘,我找到了答案。查询代码应更改为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

【讨论】:

    猜你喜欢
    • 2018-08-31
    • 2018-05-17
    • 1970-01-01
    • 1970-01-01
    • 2016-11-01
    • 2021-12-04
    • 2019-12-27
    • 1970-01-01
    • 2023-03-23
    相关资源
    最近更新 更多