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

學(xué)無(wú)先后,達(dá)者為師

網(wǎng)站首頁(yè) 編程語(yǔ)言 正文

laravel 中關(guān)于模型查詢構(gòu)造器的特殊用法

作者:Blau 更新時(shí)間: 2022-10-14 編程語(yǔ)言

laravel 中關(guān)于模型查詢構(gòu)造器的特殊用法

        • 1、whereHas
        • 2、when

記錄一些相對(duì)比較常用的特殊用例。

1、whereHas

有時(shí)在模型關(guān)聯(lián)中會(huì)碰到需要跨模型判斷條件來(lái)獲取數(shù)據(jù)的情況,比如存在兩張表 usersroles ,需要獲取角色為 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

欄目分類
最近更新