網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
laravel 中關(guān)于模型查詢構(gòu)造器的特殊用法
- 1、whereHas
- 2、when
記錄一些相對(duì)比較常用的特殊用例。
1、whereHas
有時(shí)在模型關(guān)聯(lián)中會(huì)碰到需要跨模型判斷條件來(lái)獲取數(shù)據(jù)的情況,比如存在兩張表 users 和 roles ,需要獲取角色為 viki 的用戶。
在模型關(guān)聯(lián)時(shí),官方已經(jīng)提供了方法 whereHas,實(shí)際上最好還是去查看一下 laravel源碼 會(huì)更容易理解,助手函數(shù)示例如下:
/**
* Add a relationship count / exists condition to the query with where clauses.
*
* @param string $relation
* @param \Closure|null $callback
* @param string $operator
* @param int $count
* @return \Illuminate\Database\Eloquent\Builder|static
* @static
*/
public static function whereHas($relation, $callback = null, $operator = '>=', $count = 1)
{
/** @var \Illuminate\Database\Eloquent\Builder $instance */
return $instance->whereHas($relation, $callback, $operator, $count);
}
此處該查詢語(yǔ)句可以這樣寫:
User::whereHas('role', function($query) {
// 此處閉包可以追加你需要的任何laravel支持的查詢結(jié)果語(yǔ)句
$query->where('name', 'viki');
})->get();
當(dāng)然,肯定也是存在 orWhereHas 該方法的。
2、when
在做查詢語(yǔ)句時(shí),經(jīng)常會(huì)碰到需要判斷上一個(gè)條件是否為真則執(zhí)行語(yǔ)句的問(wèn)題。這種情況下很容易拆成兩段 sql 語(yǔ)句查詢,實(shí)際上用 when 即可解決,給出 _ide_helper 的代碼追蹤:
/**
* Apply the callback's query changes if the given "value" is true.
*
* @param mixed $value
* @param callable $callback
* @param callable|null $default
* @return mixed|$this
* @static
*/
public static function when($value, $callback, $default = null)
{
/** @var \Illuminate\Database\Eloquent\Builder $instance */
return $instance->when($value, $callback, $default);
}
實(shí)際上的使用參考如下:
/**
* 獲取原todo-list事項(xiàng)
*
* @param $userIds
* @param $supervisorUserIDs
* @return mixed
*/
public function gainTodoList($userIds, $supervisorUserIDs)
{
return $this->todoSummaryRepository
->orderByDesc('created_at')
->where('status', 1)
->where('type', 1)
->when(Admin::user()->isAdministrator(), function ($query) use ($supervisorUserIDs) {
$supervisorUserIDs = array_merge([Admin::user()->id], $supervisorUserIDs);
$query->whereIn('executor_id', $supervisorUserIDs);// 包含其他主管被指定任務(wù)
})
->when(!Admin::user()->isAdministrator(), function ($query) use ($userIds) {
$query->when($userIds, function ($query) use ($userIds) {
$userIds = array_merge([Admin::user()->id], $userIds);
$query->whereIn('executor_id', $userIds);// 包含其他成員被指定任務(wù)
})
->when(!$userIds, function ($query) {
$query->where('executor_id', Admin::user()->id);// 自身任務(wù)
});
})
->get();
}
不難看出,when 會(huì)判斷第一個(gè)參數(shù)的真與假,如果是真,則執(zhí)行第一個(gè) callback,如果是假,則執(zhí)行默認(rèn)的方法,代碼就只設(shè)置了真的時(shí)候需要執(zhí)行的代碼,因?yàn)闂l件有三種,不只有兩種。這樣的話可以使代碼易讀性更好,當(dāng)然也可以拆分子句,但是 when 這個(gè)用法相對(duì)更贊。
很顯然,該方法中的最后一個(gè) when 的超管不存在的條件判斷,只要放入到上一個(gè) when 方法的最后一個(gè)閉包函數(shù)內(nèi)即可:
/**
* 獲取原todo-list事項(xiàng)
*
* @param $userIds
* @param $supervisorUserIDs
* @return mixed
*/
public function gainTodoList($userIds, $supervisorUserIDs)
{
return $this->todoSummaryRepository
->orderByDesc('created_at')
->where('status', 1)
->where('type', 1)
->when(
Admin::user()->isAdministrator(),
function ($query) use ($supervisorUserIDs) {
$supervisorUserIDs = array_merge([Admin::user()->id], $supervisorUserIDs);
$query->whereIn('executor_id', $supervisorUserIDs);// 包含其他主管被指定任務(wù)
},
function ($query) use ($userIds) {
$query->when($userIds, function ($query) use ($userIds) {
$userIds = array_merge([Admin::user()->id], $userIds);
$query->whereIn('executor_id', $userIds);// 包含其他成員被指定任務(wù)
})
->when(!$userIds, function ($query) {
$query->where('executor_id', Admin::user()->id);// 自身任務(wù)
});
})
->get();
}
todo 后續(xù)如有則繼續(xù)補(bǔ)充
laravel 6
版本關(guān)于查詢構(gòu)造的方法文件位于該路徑:
vendor/laravel/framework/src/Illuminate/Database/Eloquent
vendor/laravel/framework/src/Illuminate/Database/Query
// 模型關(guān)聯(lián)的方法文件
vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php
原文鏈接:https://blog.csdn.net/weixin_43930641/article/details/124689393
相關(guān)推薦
- 2024-04-05 mybatis(mybatis-plus)報(bào)invalid bound statement (not
- 2023-01-14 Python?pandas中to_sql的使用及問(wèn)題詳解_python
- 2022-09-04 關(guān)于python?DataFrame的合并方法總結(jié)_python
- 2022-12-03 C#通過(guò)Builder模式造車_C#教程
- 2022-10-29 python的strip、lstrip、rstrip函數(shù)的用法和實(shí)例
- 2023-04-01 Android自定義View實(shí)現(xiàn)LayoutParams的方法詳解_Android
- 2023-03-30 C/C++經(jīng)典楊輝三角問(wèn)題解決方案_C 語(yǔ)言
- 2023-01-30 delphi?判斷字符串是否為純數(shù)字組合_Delphi
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支