日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

laravel 中關于模型查詢構造器的特殊用法

作者:Blau 更新時間: 2022-10-14 編程語言

laravel 中關于模型查詢構造器的特殊用法

        • 1、whereHas
        • 2、when

記錄一些相對比較常用的特殊用例。

1、whereHas

有時在模型關聯中會碰到需要跨模型判斷條件來獲取數據的情況,比如存在兩張表 usersroles ,需要獲取角色為 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

欄目分類
最近更新