Laravel - Получить записи от многих ко многим отношениям - PullRequest
1 голос
/ 15 апреля 2019

У меня есть три таблицы во многих отношениях со многими

┌─────────────────┐          ┌─────────────────┐          ┌──────────────────┐
│ users           │          │ department_user │          │ departments      │
├─────────────────┤          ├─────────────────┤          ├──────────────────┤
| id              |          | id              |          | id               |
| name            |          | user_id         |          | name             |
└─────────────────┘          | department_id   |          └──────────────────┘
                             | joined_at       |          
                             └─────────────────┘          

Таблица отделов

1 | department 1
2 | department 2
3 | department 3

Таблица пользователей

1| Mark
2| Jack

Таблица Department_user

Id | user_id | department_id | joined_at
1  |    1    |      1        | 2019-01-01 
2  |    2    |      1        | 2019-03-26
3  |    1    |      1        | 2019-04-01
4  |    1    |      3        | 2019-05-01

Модель пользователя:

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

Модель отдела:

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

DepartmentController:

$department = Department::with(['phones', 'users' => function($query)
{
  $query->orderBy('joined_at', 'desc');
}])->get();
return view('dashboard.departments.show', compact('department'));

Show.blade:

<h3>{{  department->name }}</h3><span>{{ $department->users->count() }}</span>
@foreach ($department->users as $user)
   <li>
      {{ $user-> name }} 
      {{ $user-> departments->last()->pivot->joined_at }}
   </li>
 @endforeach

Я хочу перечислить таких пользователей, как этот

Отдел 1

1 users
Jack  –   joined_at 2019-03-26

Отдел 3

1 users
Mark   –   joined_at 2019-05-01

Но результат, который я получил,

Отдел 1

3 users
Mark   –   joined_at 2019-01-01
Jack  –   joined_at 2019-03-26
Mark   –   joined_at 2019-04-01

Отдел 3

1 users
Mark   –   joined_at 2019-05-01

Поэтому я хочу перечислить последних пользователей в определенном отделе и подсчитать их, но игнорировать дубликаты, если пользователь находился в этом отделе в предыдущие даты

Ответы [ 3 ]

0 голосов
/ 15 апреля 2019

Попробуйте это

Department::join('department_user','department_user.department_id','=','departments.id')
->join('users', 'users.id', '=', 'department_user.user_id')
->selectRaw('users.id, COUNT(*) AS count, MAX(joined_at) AS joined_at')
->groupBy('department_user.user_id')
->having('count', '<', 2)  // ignore duplicates
->orderBy('joined_at', 'desc')
->get();
0 голосов
/ 18 апреля 2019
$department = Department::with(['phones', 'users' => function($query)
{
$query->orderBy('joined_at', 'desc');
}])->get();

и перед тем как зациклить отделы

$department->users->groupBy('name');
0 голосов
/ 15 апреля 2019

Если вы хотите, чтобы отношение Многие ко многим не содержало дубликатов, просто удалите столбец Id из таблицы department_user, а затем сделайте первичный ключ таблицы комбинацией user_id и department_id.

Это позволит вам избежать дубликатов в будущем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...