Laravel wherehasin 是一个可以提升 Laravel ORM 关联关系查询性能的扩展包,可以替代 Laravel ORM 中的 whereHas 以及 whereHasMorphIn 查询方法。
环境
PHP >= 7
laravel >= 5.5
安装
composer require dcat/laravel-wherehasin
使用
whereHasIn
此方法已支持 Laravel ORM 中的所有关联关系,可以替代 whereHas
User::whereHasIn('profile')->get();
User::whereHasIn('profile', function ($q) {
$q->where('id', '>', 10);
})->get();
orWhereHasIn
User::where('name', 'like', '%laravel%')->orWhereHasIn('profile')->get();
多级关联关系
User::whereHasIn('painters.paintings', function ($q) {
$q->whereIn('id', [600, 601]);
})->orderBy('id')->get()->toArray();
需要注意的是,如果是 BelongsTo 类型的关联关系,使用 whereHasIn 时使用的不是主键,而是外键
<?php
/**
* 这里用的是"user_id in",而不是"id in"
*
* select * from `test_user_profiles` where `test_user_profiles`.`user_id` in
* (
* select `test_users`.`id` from `test_users` where `test_user_profiles`.`user_id` = `test_users`.`id`
* )
*/
$profiles = Profile::whereHasIn('user')->get();
whereHasMorphIn
此方法已支持 Laravel ORM 中的所有关联关系,可以替代 whereHasMorph
Image::whereHasMorphIn('imageable', Post::class, function ($q) {
$q->where('id', '>', 10);
})->get();