如何从HasManyThrough中获取计数与Laravel中的pivot表的关系

ryoqjall  于 2023-11-20  发布在  其他
关注(0)|答案(3)|浏览(144)

我想数一下有多少候选人参加比赛。
我有四张table:
大赛

  • ID
  • 名称
  • 直到

空缺

  • ID
  • 竞赛ID
  • 名称
  • 描述

用户

  • ID
  • 名称
  • 数据透视表:*

用户_空缺

  • ID
  • 用户标识
  • 空缺ID
  • 我的比赛模特 *
  1. protected $fillable = [
  2. 'name',
  3. 'from',
  4. 'until',
  5. 'description',
  6. ];
  7. public function vacancies()
  8. {
  9. return $this->hasMany(Vacancy::class);
  10. }
  11. public function candidates()
  12. {
  13. return $this->hasManyThrough(User::class, Vacancy::class);
  14. }

字符串

  • 我的空缺模型 *
  1. public function contest()
  2. {
  3. return $this->belongsTo(Contest::class);
  4. }
  5. public function candidates()
  6. {
  7. return $this->belongsToMany(User::class, 'user_vacancy');
  8. }

  • 我的用户模型 *
  1. public function vacancies()
  2. {
  3. return $this->belongsToMany(Vacancy::class, 'user_vacancy');
  4. }

  • 我的控制器 *
  1. public function index()
  2. {
  3. $contests = Contest::with('vacancies.candidates')
  4. ->get();
  5. return view('contests.index', compact('contests'));
  6. }

我得到了这个错误:

  1. SQLSTATE[42S22]: Column not found: 1054 Unknown column 'users.vacancy_id' in 'on clause'
  2. select
  3. count(*) as aggregate
  4. from
  5. `users`
  6. inner join `vacancies` on `vacancies`.`id` = `users`.`vacancy_id`
  7. where
  8. `vacancies`.`contest_id` = 2

当我这样做时:

  1. @foreach($contests as $contest)
  2. <tr>
  3. <td>1</td>
  4. <td>{{ $contest->name }}</td>
  5. <td>{{ date('d.m.Y', strtotime($contest->from)) }}</td>
  6. <td>{{ date('d.m.Y', strtotime($contest->until)) }}</td>
  7. <td>{{ $contest->vacancies()->count() }}</td>
  8. {{-- TODO: Topshirilgan xujjatlar sonidan kelib chiqib Nomzodlar soni shaklanadigan qilish kerak --}}
  9. <td>{{ $contest->candidates()->count() }}</td>
  10. <td>75 ta</td>
  11. @endforeach
  12. [1]: https://i.stack.imgur.com/cc57S.png
  13. [2]: https://i.stack.imgur.com/n3rOV.png

bbuxkriu

bbuxkriu1#

请将关系候选人的竞赛模型功能更新为以下内容

  1. public function candidates()
  2. {
  3. return $this->hasManyThrough(User::class, UserVacancy::class, 'vacancy_id', 'id', 'id', 'user_id');
  4. }

字符串

zxlwwiss

zxlwwiss2#

更新候选人关系。

  1. public function candidates()
  2. {
  3. return $this->hasManyThrough(User::class);
  4. }

字符串
控制器

  1. public function index()
  2. {
  3. $contests = Contest::with('vacancies.candidates')->get();
  4. return view('contests.index', compact('contests'));
  5. }


你也可以使用withCount查询,但我保留了你的原始代码。
叶片

  1. @foreach($contests as $contest)
  2. <tr>
  3. <td>{{ $loop->iteration }}</td> {{--<td>1</td> use iteration instead--}}
  4. <td>{{ $contest->name }}</td>
  5. <td>{{ date('d.m.Y', strtotime($contest->from)) }}</td>
  6. <td>{{ date('d.m.Y', strtotime($contest->until)) }}</td>
  7. <td>{{ $contest->vacancies->count() }}</td>
  8. <td>{{ $contest->candidates->count() }}</td>
  9. <td>75 ta</td>
  10. </tr>
  11. @endforeach

展开查看全部
ql3eal8s

ql3eal8s3#

定义模型和关系:
竞赛模式:

  1. class Contest extends Model
  2. {
  3. public function vacancies()
  4. {
  5. return $this->hasMany(Vacancy::class);
  6. }
  7. public function candidates()
  8. {
  9. return $this->hasManyThrough(User::class, Vacancy::class, 'contest_id', 'user_id');
  10. }
  11. }

字符串

空缺型号:

  1. class Vacancy extends Model
  2. {
  3. public function contest()
  4. {
  5. return $this->belongsTo(Contest::class);
  6. }
  7. public function candidates()
  8. {
  9. return $this->belongsToMany(User::class, 'user_vacancy');
  10. }
  11. }

用户型号:

  1. class User extends Model
  2. {
  3. public function vacancies()
  4. {
  5. return $this->belongsToMany(Vacancy::class, 'user_vacancy');
  6. }
  7. }

然后,您可以查询您的竞赛模型以检索每个竞赛的候选人计数:

  1. $contests = Contest::withCount('candidates')->get();
  2. foreach ($contests as $contest) {
  3. echo "Contest: {$contest->name}, Candidates Count: {$contest->candidates_count}\n";
  4. }

展开查看全部

相关问题