Laravel Builder JoinClause :: whereIn()必须是类型数组,给定对象

时间:2016-05-20 10:24:37

标签: laravel eloquent laravel-5.2

我有以下范围:

public function scopeFilteredForUser($query) {
    $query->select('vacancies.*', DB::raw('COUNT(skill_id) as total'))
        ->leftJoin('skillables', function($join) {
            $join->on('skillables.skillable_id', '=', 'vacancies.id')
                ->where('skillable_type', '=', 'App\Vacancy')
                // ->whereIn('skill_id', function($query) {
                //  $query->select('skill_id')
                //      ->from('skillables')
                //      ->where('skillable_id', '=', 82)
                //      ->where('skillable_type', '=', 'App\User');
                //  });
                ->whereIn('skill_id', [2,4,5]);
        })
    ->where('university_id', '=', 2)
    ->whereNotIn('id', function($query) {
        $query->select('vacancy_id')
            ->from('shortlists')
            ->where('user_id', '=', 82);
    })
    ->groupBy('id')
    ->orderBy('total', 'desc');
}

当我注释掉硬编码的数组时

->whereIn('skill_id', [2,4,5]);

尝试使用

->whereIn('skill_id', function($query) {
    $query->select('skill_id')
        ->from('skillables')
        ->where('skillable_id', '=', 82)
        ->where('skillable_type', '=', 'App\User');
});

我收到以下错误:

  

类型错误:传递给Illuminate \ Database \ Query \ JoinClause :: whereIn()的参数2必须是类型数组,给定对象,在/home/vagrant/code/jobs/app/Vacancy.php中调用61

我不知道为什么因为它似乎与我后来在范围内使用它的方式相同......?

我错过了什么?

TIA!

2 个答案:

答案 0 :(得分:0)

试试这个

->whereIn('skill_id', function($query) {
  $query->select('skill_id')
    ->from('skillables')
    ->where('skillable_id', '=', 82)
    ->where('skillable_type', '=', 'App\User')
    ->lists('skill_id');
});

答案 1 :(得分:0)

此代码返回一个查询对象吗?

$query->select('skill_id')
    ->from('skillables')
    ->where('skillable_id', '=', 82)
    ->where('skillable_type', '=', 'App\User');

这就是你收到此错误的原因:

  

类型错误:传递给Illuminate \ Database \ Query \ JoinClause :: whereIn()的参数2必须是类型数组,给定对象,在/home/vagrant/code/jobs/app/Vacancy.php中调用61

错误告诉您:您返回的是查询对象而不是数组!

您希望通过调用get()list()first()来返回值,然后将其转换为数组。试试这个,看它是否有效:

$query->select('skill_id')
    ->from('skillables')
    ->where('skillable_id', '=', 82)
    ->where('skillable_type', '=', 'App\User')
    ->get()
    ->toArray(); // returns something!