Laravel-根据数据透视表中的字段显示具有多对多关系的字段

时间:2019-04-01 17:06:07

标签: php laravel

我有这个数据库结构

table users     table office_user    table offices
-----------     -----------------    -------------

id *            id *                 id *
full_name       user_id              name       
                office_id
                joined_at

因此在我的项目中,每个办公室都有许多用户,并且用户可以在日期(joined_at)加入多个办公室

User.php模型

public function offices()
    {
        return $this->belongsToMany('App\Office)->withPivot('joined_at');
    }

Office.php模型

public function users()
    {
        return $this->belongsToMany('App\User)->withPivot('joined_at');
    }

OfficeController.php

public function show(Office $office)
    {
        $users = User::with(array('phones', 'offices' , function($query)
        {
            $query->orderBy('joined_at', 'desc');
        }))->get();
        return view('dashboard.offices.show', compact(['office', 'users']));
    }

我需要两件事:

1-获取每个办公室的当前用户列表

2-每个办公室的当前用户数

我已经实现了:

<h3>{{ $office->name }}</h3><span>{{ $office->users->count() }}</span>
    @foreach ($office->users as $user)
        <li>{{ $user->full_name }}</li>
    @endforeach

但是结果并不像预期的那样,它给了我某些办公室的所有用户,并且无论他们加入的日期是多少

我希望最近一次加入该办公室的用户列表,并根据数据透视表中的joined_at字段进行计数

谢谢你,抱歉我的英语

1 个答案:

答案 0 :(得分:1)

  

但是结果并不像预期的那样,它给了我某些办公室的所有用户,并且无论他们加入的日期是多少

当您执行$office->users->count()时,这是预期的行为,因为您可以随时检索每个办公室的所有关联的users,因此,假设您返回了所有这些用户,则count()在集合中执行的将全部计算在内。

您的数据透视属性只是一个timestamp,那么如何减少返回的用户数量?今天/过去一小时/过去15分钟内加入办公室的用户?

如果是这样,可以将约束添加到count()方法中以获得所需的结果。

作为示例,在以下几行中,我们将约束具有属于今天的joined_at的关联办公室:

public function show(Office $office)
{
   $users = User::with([
        'phones',
        'offices' => function ($offices) {
            $offices->whereDate('joined_at', '>', now()->startOfDay());
        },
    ])->get();

    return view('dashboard.offices.show', compact([office, 'users']));
}

检查文档的this section

  

约束渴望的负荷

     

有时您可能希望加载一段关系,但也要指定   急切加载查询的其他查询条件。这是一个   例如:

$users = App\User::with(['posts' => function ($query) {
    $query->where('title', 'like', '%first%');
}])->get();
     

在此示例中,Eloquent仅渴望加载帖子所在的位置   title列包含单词first。您可以致电其他查询   进一步定制急切加载操作的构建器方法:

$users = App\User::with(['posts' => function ($query) {
    $query->orderBy('created_at', 'desc');
}])->get();