網站首頁 編程語言 正文
laravel 中關于模型查詢構造器的特殊用法
- 1、whereHas
- 2、when
記錄一些相對比較常用的特殊用例。
1、whereHas
有時在模型關聯中會碰到需要跨模型判斷條件來獲取數據的情況,比如存在兩張表 users 和 roles ,需要獲取角色為 viki 的用戶。
在模型關聯時,官方已經提供了方法 whereHas,實際上最好還是去查看一下 laravel源碼 會更容易理解,助手函數示例如下:
/**
* 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);
}
此處該查詢語句可以這樣寫:
User::whereHas('role', function($query) {
// 此處閉包可以追加你需要的任何laravel支持的查詢結果語句
$query->where('name', 'viki');
})->get();
當然,肯定也是存在 orWhereHas 該方法的。
2、when
在做查詢語句時,經常會碰到需要判斷上一個條件是否為真則執行語句的問題。這種情況下很容易拆成兩段 sql 語句查詢,實際上用 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);
}
實際上的使用參考如下:
/**
* 獲取原todo-list事項
*
* @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);// 包含其他主管被指定任務
})
->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);// 包含其他成員被指定任務
})
->when(!$userIds, function ($query) {
$query->where('executor_id', Admin::user()->id);// 自身任務
});
})
->get();
}
不難看出,when 會判斷第一個參數的真與假,如果是真,則執行第一個 callback,如果是假,則執行默認的方法,代碼就只設置了真的時候需要執行的代碼,因為條件有三種,不只有兩種。這樣的話可以使代碼易讀性更好,當然也可以拆分子句,但是 when 這個用法相對更贊。
很顯然,該方法中的最后一個 when 的超管不存在的條件判斷,只要放入到上一個 when 方法的最后一個閉包函數內即可:
/**
* 獲取原todo-list事項
*
* @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);// 包含其他主管被指定任務
},
function ($query) use ($userIds) {
$query->when($userIds, function ($query) use ($userIds) {
$userIds = array_merge([Admin::user()->id], $userIds);
$query->whereIn('executor_id', $userIds);// 包含其他成員被指定任務
})
->when(!$userIds, function ($query) {
$query->where('executor_id', Admin::user()->id);// 自身任務
});
})
->get();
}
todo 后續如有則繼續補充
laravel 6
版本關于查詢構造的方法文件位于該路徑:
vendor/laravel/framework/src/Illuminate/Database/Eloquent
vendor/laravel/framework/src/Illuminate/Database/Query
// 模型關聯的方法文件
vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php
原文鏈接:https://blog.csdn.net/weixin_43930641/article/details/124689393
相關推薦
- 2023-01-18 解讀Opencv中Filter2D函數的補全方式_python
- 2022-08-21 python深度學習tensorflow入門基礎教程示例_python
- 2022-09-16 淺析python中5個帶key的內置函數_python
- 2021-12-07 c++代碼各種注釋示例詳解_C 語言
- 2022-11-22 docker+Nginx部署前端項目的詳細過程記錄_docker
- 2022-06-18 C#多線程之線程中止Abort()方法_C#教程
- 2023-07-09 前端axios請求,傳遞數組的時候會在url的后邊加中括號[]
- 2023-03-13 pandas行和列的獲取的實現_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支