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

ryoqjall  于 11个月前  发布在  其他
关注(0)|答案(3)|浏览(112)

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

  • ID
  • 名称
  • 直到

空缺

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

用户

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

用户_空缺

  • ID
  • 用户标识
  • 空缺ID
  • 我的比赛模特 *
protected $fillable = [
        'name',
        'from',
        'until',
        'description',
    ];

public function vacancies()
    {
        return $this->hasMany(Vacancy::class);
    }

public function candidates()
    {
        return $this->hasManyThrough(User::class, Vacancy::class);
    }

字符串

  • 我的空缺模型 *
public function contest()
    {
        return $this->belongsTo(Contest::class);
    }

public function candidates()
    {
        return $this->belongsToMany(User::class, 'user_vacancy');
    }

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

  • 我的控制器 *
public function index()
    {
        $contests = Contest::with('vacancies.candidates')
            ->get();

        return view('contests.index', compact('contests'));
    }

我得到了这个错误:

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

当我这样做时:

@foreach($contests as $contest)
                                    <tr>
                                        <td>1</td>
                                        <td>{{ $contest->name }}</td>
                                        <td>{{ date('d.m.Y', strtotime($contest->from)) }}</td>
                                        <td>{{ date('d.m.Y', strtotime($contest->until)) }}</td>
                                        <td>{{ $contest->vacancies()->count() }}</td>
                                        {{-- TODO: Topshirilgan xujjatlar sonidan kelib chiqib Nomzodlar soni shaklanadigan qilish kerak --}}
                                        <td>{{ $contest->candidates()->count() }}</td>
                                        <td>75 ta</td>
@endforeach

  [1]: https://i.stack.imgur.com/cc57S.png
  [2]: https://i.stack.imgur.com/n3rOV.png

bbuxkriu

bbuxkriu1#

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

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

字符串

zxlwwiss

zxlwwiss2#

更新候选人关系。

public function candidates()
{
    return $this->hasManyThrough(User::class);
}

字符串
控制器

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


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

@foreach($contests as $contest)
    <tr>
        <td>{{ $loop->iteration }}</td> {{--<td>1</td> use iteration instead--}}
        <td>{{ $contest->name }}</td>
        <td>{{ date('d.m.Y', strtotime($contest->from)) }}</td>
        <td>{{ date('d.m.Y', strtotime($contest->until)) }}</td>
        <td>{{ $contest->vacancies->count() }}</td>
        <td>{{ $contest->candidates->count() }}</td>
        <td>75 ta</td>
    </tr>
@endforeach

ql3eal8s

ql3eal8s3#

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

class Contest extends Model
{
   public function vacancies()
   {
        return $this->hasMany(Vacancy::class);
   }
        
   public function candidates()
   {
        return $this->hasManyThrough(User::class, Vacancy::class, 'contest_id', 'user_id');
   }
}

字符串

空缺型号:

class Vacancy extends Model
{
    public function contest()
    {
        return $this->belongsTo(Contest::class);
    }
        
    public function candidates()
    {
        return $this->belongsToMany(User::class, 'user_vacancy');
     }
}

用户型号:

class User extends Model
{
   public function vacancies()
   {
        return $this->belongsToMany(Vacancy::class, 'user_vacancy');
   }
}

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

$contests = Contest::withCount('candidates')->get();

foreach ($contests as $contest) {
        echo "Contest: {$contest->name}, Candidates Count: {$contest->candidates_count}\n";
}

相关问题