获取包含所有选定项目的所有对象

时间:2018-03-15 09:09:54

标签: php laravel eloquent

我有3张桌子:

证书 - 所有可用证书

用户 - 用户表

UserCertificates - 用户拥有的证书。每条记录都有自己的ID,user_id和certificate_id外键。

现在,我有一个数组(或只有一个值)的证书ID,我需要获得拥有这些所选证书的所有用户。因此,如果证书ID是1,4,7我需要选择拥有所有这些证书的所有用户,而不是1 OR 4 OR 7.

我有工作代码,我花了好几个小时让它工作,但看起来并不干净。有更清洁的方法吗?

$requiredCertificates是certificate_id的

数组
public function getMatches(Opportunity $opportunity)
{
    $requiredCertificates = $this->getRequiredCertificates($opportunity);

    return User::with('certificates')
        ->whereHas('certificates', function ($query) use ($requiredCertificates) {
            $query->select(\DB::raw('count(distinct certificate_id)'))->whereIn('certificate_id', $requiredCertificates);
        }, '=', count($requiredCertificates))
        ->get();
}

1 个答案:

答案 0 :(得分:0)

试试这个..

public function getMatches(Opportunity $opportunity)
{
    $requiredCertificates = $this->getRequiredCertificates($opportunity);

    $users = User::with('certificates');

    foreach($requiredCertificates as $certificateId) {
        $users->whereHas('certificates', function ($query) use ($certificateId) {
            $query->where('certificate_id', $certificateId);
        });
    }

    return $users->get();
}