新闻中心

记录团队成长点滴以及对技术、理念的探索,同时我们乐于分享!

Laravel ORM 关联关系whereHas 查询性能优化

2020-08-01 11:20:17 分类:技术学堂

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();