我有以下范围:
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!
答案 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!