亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

目錄
#use simplePaginate方法
>讓我們看一下使用
>當(dāng)我們碰到這條路線(xiàn)時(shí),我們將獲得類(lèi)似於以下內(nèi)容的JSON響應(yīng)(我將cursorPaginate>字段限制為僅3個(gè)記錄的簡(jiǎn)短):
>方法中,我們定義,每當(dāng)我們通過(guò)此資源處理用戶(hù)時(shí),我們只想返回
>使用分頁(yè)數(shù)據(jù)構(gòu)建視圖時(shí),您可能需要允許用戶(hù)更改每個(gè)頁(yè)面顯示的記錄數(shù)量。這可能是通過(guò)下拉列表或數(shù)字輸入字段。
由於數(shù)據(jù)庫(kù)處理
首頁(yè) 後端開(kāi)發(fā) php教程 Laravel的分頁(yè)指南

Laravel的分頁(yè)指南

Mar 06, 2025 am 02:04 AM

分頁(yè)是Web應(yīng)用程序中的常見(jiàn)功能。我從事過(guò)的幾乎所有Laravel應(yīng)用程序都實(shí)施了某種形式的分頁(yè)。

但是什麼是分頁(yè),為什麼要使用它?我們?nèi)绾卧贚aravel應(yīng)用程序中實(shí)施分頁(yè)?我們?nèi)绾螞Q定要使用哪種分頁(yè)方法? 在本文中,我們將回答這些問(wèn)題,並探索如何在Laravel中使用分頁(yè)來(lái)獲得刀片視圖和API端點(diǎn)。到本文結(jié)束時(shí),您應(yīng)該有足夠的信心開(kāi)始在自己的項(xiàng)目中使用分頁(yè)。

#什麼是分頁(yè)?

分頁(yè)是一種用於將大數(shù)據(jù)集分為較小塊(或頁(yè)面)的技術(shù)。它允許您顯示數(shù)據(jù)的一個(gè)子集,而不是一次顯示所有可能的值。

> 例如,想像一下,您有一個(gè)頁(yè)面,可以輸出應(yīng)用程序中所有用戶(hù)的名稱(chēng)。如果您有成千上萬(wàn)的用戶(hù),則將所有用戶(hù)全部顯示在單個(gè)頁(yè)面上是不切實(shí)際的。取而代之的是,您可以使用分頁(yè)來(lái)在每個(gè)頁(yè)面上顯示一個(gè)用戶(hù)的子集(例如10個(gè)用戶(hù)),並允許用戶(hù)在頁(yè)面之間導(dǎo)航以查看更多用戶(hù)(下一個(gè)10)。

通過(guò)使用分頁(yè),您可以:>

>提高應(yīng)用程序的性能 - 由於您一次獲取較小的數(shù)據(jù)子集,因此您可以從數(shù)據(jù)庫(kù)中獲取的數(shù)據(jù)更少,然後返回。

改善用戶(hù)體驗(yàn) - 用戶(hù)一次只能一次對(duì)一小部分?jǐn)?shù)據(jù)感興趣(通常在前幾頁(yè)中找到,尤其是在使用過(guò)濾器和搜索詞時(shí))。通過(guò)使用分頁(yè),您可以避免顯示用戶(hù)不感興趣的數(shù)據(jù)。

>

改進(jìn)頁(yè)面加載時(shí)間 - 僅一次獲取數(shù)據(jù)的子集,您可以減少需要加載到頁(yè)面上的數(shù)據(jù)量,從而可以改善頁(yè)面加載和JavaScript處理時(shí)間。

>

分頁(yè)通常可以分為兩種不同的類(lèi)型:

>

基於偏移的分頁(yè) - 這是您可能會(huì)在Web應(yīng)用程序中遇到的最常見(jiàn)的分頁(yè)類(lèi)型,尤其是在用戶(hù)界面(UI)中。它涉及基於“偏移”和“限制”從數(shù)據(jù)庫(kù)中獲取數(shù)據(jù)庫(kù)的子集。例如,您可能會(huì)從第20個(gè)記錄開(kāi)始獲取10個(gè)記錄,以獲取數(shù)據(jù)的第三頁(yè)。
    基於光標(biāo)的分頁(yè) - 這種類(lèi)型的分頁(yè)涉及根據(jù)“光標(biāo)”獲取數(shù)據(jù)子集。光標(biāo)通常是數(shù)據(jù)庫(kù)中記錄的唯一標(biāo)識(shí)符。例如,您可以從記錄開(kāi)始的下一個(gè)10個(gè)記錄中獲取ID 20的記錄。
  • Laravel提供了三種不同的方法,用於在您的應(yīng)用程序中使用雄辯的查詢(xún):
    • paginate - 使用基於偏移的分頁(yè)並獲取數(shù)據(jù)集中的記錄總數(shù)。 >
    • - 使用基於偏移的分頁(yè),但沒(méi)有獲取數(shù)據(jù)集中的記錄總數(shù)。 > simplePaginate
    • - 使用基於光標(biāo)的分頁(yè),並且不會(huì)獲取數(shù)據(jù)集中的記錄總數(shù)。 >
    • cursorPaginate>讓我們更詳細(xì)地看一下這些方法。
    • >
    #use

    方法

    paginate方法允許您根據(jù)偏移和限制從數(shù)據(jù)庫(kù)中獲取數(shù)據(jù)子集(當(dāng)我們查看基礎(chǔ)SQL查詢(xún)時(shí),我們將在稍後查看這些數(shù)據(jù)庫(kù))。

    您可以使用這樣的方法:

    paginate

    >運(yùn)行上述代碼將導(dǎo)致

    >是paginate的實(shí)例,通常是

    >對(duì)象。此Paginator實(shí)例包含您需要在應(yīng)用程序中顯示分頁(yè)數(shù)據(jù)的所有信息。 >
    <!-- Syntax highlighted by torchlight.dev -->use App\Models\User;
    
    $users = User::query()->paginate();
    

    方法可以根據(jù)URL中的$users查詢(xún)參數(shù)自動(dòng)確定所請(qǐng)求的頁(yè)碼。例如,如果您訪(fǎng)問(wèn)了IlluminateContractsPaginationLengthAwarePaginatorIlluminatePaginationLengthAwarePaginator方法將獲取數(shù)據(jù)的第二頁(yè)。 默認(rèn)情況下,Laravel默認(rèn)情況下的所有分頁(yè)方法一次都以一次獲取15個(gè)記錄。但是,這可以將其更改為不同的值(我們將稍後再看一下)。

    >

    #usingpaginate帶有刀片視圖page https://my-app.com/users?page=2>讓我們看一下在刀片視圖中呈現(xiàn)數(shù)據(jù)時(shí)如何使用paginate的方法。

    想像我們有一條簡(jiǎn)單的路由,可以以分頁(yè)格式從數(shù)據(jù)庫(kù)中獲取用戶(hù),並將其傳遞給視圖:

    paginate我們的

    文件可能看起來(lái)像這樣:

    > paginate

    結(jié)果頁(yè)面看起來(lái)像這樣:

    >

    <!-- Syntax highlighted by torchlight.dev -->use App\Models\User;
    use Illuminate\Support\Facades\Route;
    
    Route::get('users', function () {
        $users = User::query()->paginate();
    
        return view('users.index', [
            'users' => $users,
        ]);
    });
    

    resources/views/users/index.blade.php

    >讓我們分解刀片視圖中發(fā)生的事情:
    <!-- Syntax highlighted by torchlight.dev --><html>
    <head>
        <title>Paginate</title>
        <script src="https://cdn.tailwindcss.com"></script>
    </head>
    
    <body>
        <div class="max-w-5xl mx-auto py-8">
            <h1 class="text-5xl">Paginate</h1>
    
            <ul class="py-4">
                @foreach ($users as $user)
                    <li class="py-1 border-b">{{ $user->name }}</li>
                @endforeach
            </ul>
    
            {{ $users->links() }}
        </div>
    </body>
    </html>
    
    • >我們正在循環(huán)瀏覽$users字段中存在的每個(gè)用戶(hù)(IlluminatePaginationLengthAwarePaginator>對(duì)象)並輸出其名稱(chēng)。
    • >
    • >我們?cè)?ancip>對(duì)像上調(diào)用links>方法。這是一種非常方便的方法,它返回一些顯示分頁(yè)鏈接的HTML(例如“上一個(gè)”,“下一個(gè)”和頁(yè)碼)。這意味著您不必?fù)?dān)心自己創(chuàng)建分頁(yè)鏈接,而Laravel會(huì)為您處理所有這些。 $users
    >我們還可以看到,

    方法正在為我們提供分頁(yè)數(shù)據(jù)的概述。我們可以看到,我們正在查看第16至30個(gè)記錄,總共有50個(gè)記錄。我們還可以看到我們?cè)诘诙?yè)上,總共有4頁(yè)。 paginate>重要的是要注意,

    >方法將使用尾風(fēng)CSS返回HTML樣式。如果您想使用除尾風(fēng)以外的其他東西,或者想自己設(shè)置分頁(yè)鏈接,則可以查看有關(guān)自定義分頁(yè)視圖的文檔。

    > links #using

    在API端點(diǎn)

    paginate以及在刀片視圖中使用

    方法,您也可以在API端點(diǎn)中使用它。 Laravel通過(guò)將分頁(yè)的數(shù)據(jù)自動(dòng)轉(zhuǎn)換為JSON,使此過(guò)程變得容易。 端點(diǎn)(通過(guò)將以下路由添加到我們的paginate文件),該端口以JSON格式返回了分頁(yè)的用戶(hù):>

    >訪(fǎng)問(wèn)/api/users端點(diǎn)將返回類(lèi)似於以下的JSON響應(yīng)(請(qǐng)注意,出於簡(jiǎn)潔起見(jiàn),我將routes/api.php>字段限制為3個(gè)記錄):>

    <!-- Syntax highlighted by torchlight.dev -->use App\Models\User;
    
    $users = User::query()->paginate();
    
    讓我們分解JSON響應(yīng):

    • current_page - 我們正在使用的當(dāng)前頁(yè)面。在這種情況下,我們?cè)诘谝豁?yè)上。
    • data - 正在返回的實(shí)際數(shù)據(jù)本身。在這種情況下,它包含前15位用戶(hù)(簡(jiǎn)短為3個(gè)用戶(hù))。
    • >
    • first_page_url - 數(shù)據(jù)的第一頁(yè)的URL。
    • >
    • from - 返回?cái)?shù)據(jù)的起始記錄號(hào)。在這種情況下,這是第一個(gè)記錄。如果我們?cè)诘诙?yè)上,那將是16。
    • - 數(shù)據(jù)的總數(shù)。在這種情況下,有4頁(yè)。 last_page
    • - 數(shù)據(jù)的最後一頁(yè)的URL。 last_page_url>
    • - 指向數(shù)據(jù)不同頁(yè)面的鏈接數(shù)組。這包括“上一個(gè)”和“下一個(gè)”鏈接以及頁(yè)碼。 links>
    • - 數(shù)據(jù)的下一頁(yè)的URL。 next_page_url
    • - 端點(diǎn)的基本URL。
    • > path
    • - 每頁(yè)返回的記錄數(shù)。在這種情況下,是15。
    • per_page - 數(shù)據(jù)的上一頁(yè)的URL。在這種情況下,這是
    • ,因?yàn)槲覀冊(cè)诘谝豁?yè)上。如果我們?cè)诘诙?yè)上,這將是第一頁(yè)的URL。
    • > prev_page_urlnull - 返回?cái)?shù)據(jù)的結(jié)尾記錄號(hào)。在這種情況下,這是第15張記錄。如果我們?cè)诘诙?yè)上,那將是30。
    • - 數(shù)據(jù)集中的記錄總數(shù)。在這種情況下,有50個(gè)記錄。 to
    • #基礎(chǔ)SQL查詢(xún)total
    • 在Laravel中使用
    方法會(huì)導(dǎo)致兩個(gè)SQL查詢(xún)正在運(yùn)行:

    第一個(gè)查詢(xún)獲取數(shù)據(jù)集中的記錄總數(shù)。這用於確定信息,例如頁(yè)面總數(shù)和記錄總數(shù)。 paginate第二個(gè)查詢(xún)根據(jù)偏移和限制值獲取數(shù)據(jù)子集。例如,它可能正在獲取用戶(hù)以供我們處理和返回。

    >
    • >因此,如果我們想獲取用戶(hù)的第一頁(yè)(每個(gè)頁(yè)面有15個(gè)用戶(hù)),則將運(yùn)行以下SQL查詢(xún):
    • >

    在第二個(gè)查詢(xún)中,我們可以看到
    <!-- Syntax highlighted by torchlight.dev -->use App\Models\User;
    
    $users = User::query()->paginate();
    
    值設(shè)置為15。這是每頁(yè)返回的記錄數(shù)。

    >

    <!-- Syntax highlighted by torchlight.dev -->use App\Models\User;
    use Illuminate\Support\Facades\Route;
    
    Route::get('users', function () {
        $users = User::query()->paginate();
    
        return view('users.index', [
            'users' => $users,
        ]);
    });
    
    值的計(jì)算如下:

    > limit

    >因此,如果我們想獲取用戶(hù)的第三頁(yè),則

    的值將計(jì)算為:offset>

    <!-- Syntax highlighted by torchlight.dev --><html>
    <head>
        <title>Paginate</title>
        <script src="https://cdn.tailwindcss.com"></script>
    </head>
    
    <body>
        <div class="max-w-5xl mx-auto py-8">
            <h1 class="text-5xl">Paginate</h1>
    
            <ul class="py-4">
                @foreach ($users as $user)
                    <li class="py-1 border-b">{{ $user->name }}</li>
                @endforeach
            </ul>
    
            {{ $users->links() }}
        </div>
    </body>
    </html>
    
    >因此,

    值將為30,我們將獲取第31到第45個(gè)記錄。第三頁(yè)的查詢(xún)看起來(lái)像:offset

    <!-- Syntax highlighted by torchlight.dev -->use App\Models\User;
    use Illuminate\Support\Facades\Route;
    
    Route::get('paginate', function () {
        return User::query()->paginate();
    });
    

    <!-- Syntax highlighted by torchlight.dev -->use App\Models\User;
    
    $users = User::query()->paginate();
    

    #use simplePaginate方法

    simplePaginate方法與paginate方法非常相似,但具有一個(gè)關(guān)鍵差異。該方法未獲取數(shù)據(jù)集中的記錄總數(shù)。 simplePaginate> 正如我們剛剛看到的那樣,當(dāng)我們使用

    方法時(shí),我們還會(huì)獲取有關(guān)數(shù)據(jù)集中可用的記錄總數(shù)和頁(yè)面的信息。然後,我們可以使用此信息來(lái)顯示諸如UI或API響應(yīng)中的頁(yè)面總數(shù)等內(nèi)容。

    > paginate>但是,如果您不打算向用戶(hù)(或消耗API的開(kāi)發(fā)人員)顯示這些詳細(xì)信息,那麼我們可以使用

    >

    >simplePaginate>來(lái)避免不需要的數(shù)據(jù)庫(kù)查詢(xún)(計(jì)算記錄總數(shù))。

    方法可以與simplePaginate方法相同的方式使用:paginate>

    <!-- Syntax highlighted by torchlight.dev -->use App\Models\User;
    use Illuminate\Support\Facades\Route;
    
    Route::get('users', function () {
        $users = User::query()->paginate();
    
        return view('users.index', [
            'users' => $users,
        ]);
    });
    
    運(yùn)行上述代碼將導(dǎo)致

    的實(shí)例,通常為$users>對(duì)象。 IlluminateContractsPaginationPaginator>與IlluminatePaginationPaginator方法返回的對(duì)像不同,

    >對(duì)像不包含有關(guān)數(shù)據(jù)集中記錄總數(shù)的信息,也不知道有多少頁(yè)或總記錄。它只知道當(dāng)前數(shù)據(jù)頁(yè)面以及是否還有更多記錄可以獲取。

    > IlluminatePaginationLengthAwarePaginator #usingpaginate帶有刀片視圖IlluminatePaginationPaginator

    >讓我們看一下如何使用刀片視圖的方法。我們假設(shè)我們有與以前相同的路線(xiàn),但是這次我們使用的

    方法:> simplePaginate

    我們將以與以前相同的方式構(gòu)建刀片視圖:

    > simplePaginate simplePaginate結(jié)果頁(yè)面看起來(lái)像這樣:

    >
    <!-- Syntax highlighted by torchlight.dev --><html>
    <head>
        <title>Paginate</title>
        <script src="https://cdn.tailwindcss.com"></script>
    </head>
    
    <body>
        <div class="max-w-5xl mx-auto py-8">
            <h1 class="text-5xl">Paginate</h1>
    
            <ul class="py-4">
                @foreach ($users as $user)
                    <li class="py-1 border-b">{{ $user->name }}</li>
                @endforeach
            </ul>
    
            {{ $users->links() }}
        </div>
    </body>
    </html>
    

    <!-- Syntax highlighted by torchlight.dev -->use App\Models\User;
    use Illuminate\Support\Facades\Route;
    
    Route::get('paginate', function () {
        return User::query()->paginate();
    });
    
    正如我們?cè)诖耸纠兴吹降哪菢樱?p>>的輸出與使用

    >方法時(shí)看到的輸出不同。由於該方法沒(méi)有獲取記錄總數(shù),因此它沒(méi)有頁(yè)面或記錄總數(shù)的上下文,只有下一頁(yè)是否存在。因此,我們僅在分頁(yè)鏈接中看到“上一個(gè)”和“下一個(gè)”鏈接。

    > #using在API端點(diǎn)

    >您也可以在API端點(diǎn)中使用$users->links()>方法。 Laravel將自動(dòng)將分頁(yè)數(shù)據(jù)轉(zhuǎn)換為您的JSON。 paginate>讓我們構(gòu)建一個(gè)simplePaginate端點(diǎn),以JSON格式返回分頁(yè)的用戶(hù):

    <!-- Syntax highlighted by torchlight.dev -->use App\Models\User;
    
    $users = User::query()->paginate();
    

    >當(dāng)我們碰到這條路線(xiàn)時(shí),我們將獲得類(lèi)似於以下內(nèi)容的JSON響應(yīng)(我將data>字段限制為僅3個(gè)記錄的簡(jiǎn)短):

    >
    <!-- Syntax highlighted by torchlight.dev -->use App\Models\User;
    use Illuminate\Support\Facades\Route;
    
    Route::get('users', function () {
        $users = User::query()->paginate();
    
        return view('users.index', [
            'users' => $users,
        ]);
    });
    
    如我們所見(jiàn),JSON響應(yīng)與使用

    >方法時(shí)得到的響應(yīng)非常相似。關(guān)鍵區(qū)別在於,我們沒(méi)有響應(yīng)中的,paginatelast_pagelast_page_url>字段。 links。 total?;A(chǔ)SQL查詢(xún)

    >讓我們看一下使用

    >方法時(shí)運(yùn)行的基礎(chǔ)SQL查詢(xún)。

    simplePaginate

    方法仍然依賴(lài)於

    simplePaginate>值來(lái)獲取數(shù)據(jù)庫(kù)的數(shù)據(jù)子集。但是,它沒(méi)有運(yùn)行查詢(xún)來(lái)獲取數(shù)據(jù)集中的記錄總數(shù)。 > limitoffset值仍以與以前相同的方式計(jì)算:

    >

    但是,offset值的計(jì)算略有不同。它被計(jì)算為:

    <!-- Syntax highlighted by torchlight.dev --><html>
    <head>
        <title>Paginate</title>
        <script src="https://cdn.tailwindcss.com"></script>
    </head>
    
    <body>
        <div class="max-w-5xl mx-auto py-8">
            <h1 class="text-5xl">Paginate</h1>
    
            <ul class="py-4">
                @foreach ($users as $user)
                    <li class="py-1 border-b">{{ $user->name }}</li>
                @endforeach
            </ul>
    
            {{ $users->links() }}
        </div>
    </body>
    </html>
    

    這是因?yàn)?code>limit>方法需要比paginate值更多的記錄來(lái)確定是否有更多記錄可以獲取。例如,假設(shè)我們每頁(yè)獲取15個(gè)記錄。

    >值將為16。因此,如果要返回16個(gè)記錄,我們知道至少還有一頁(yè)可以獲取的數(shù)據(jù)。如果返回了少於16個(gè)記錄,我們會(huì)知道我們?cè)跀?shù)據(jù)的最後一頁(yè)。
    <!-- Syntax highlighted by torchlight.dev -->use App\Models\User;
    use Illuminate\Support\Facades\Route;
    
    Route::get('paginate', function () {
        return User::query()->paginate();
    });
    
    >因此,如果我們想獲取用戶(hù)的第一頁(yè)(每個(gè)頁(yè)面有15個(gè)用戶(hù)),則將運(yùn)行以下SQL查詢(xún):

    > simplePaginate perPage第二頁(yè)的查詢(xún)看起來(lái)像:limit

    #use

    方法
    <!-- Syntax highlighted by torchlight.dev -->{
      "current_page": 1,
      "data": [
        {
          "id": 1,
          "name": "Andy Runolfsson",
          "email": "teresa.wiegand@example.net",
          "email_verified_at": "2024-10-15T23:19:28.000000Z",
          "created_at": "2024-10-15T23:19:29.000000Z",
          "updated_at": "2024-10-15T23:19:29.000000Z"
        },
        {
          "id": 2,
          "name": "Rafael Cummings",
          "email": "odessa54@example.org",
          "email_verified_at": "2024-10-15T23:19:28.000000Z",
          "created_at": "2024-10-15T23:19:29.000000Z",
          "updated_at": "2024-10-15T23:19:29.000000Z"
        },
        {
          "id": 3,
          "name": "Reynold Lindgren",
          "email": "juwan.johns@example.net",
          "email_verified_at": "2024-10-15T23:19:28.000000Z",
          "created_at": "2024-10-15T23:19:29.000000Z",
          "updated_at": "2024-10-15T23:19:29.000000Z"
        }
      ],
      "first_page_url": "http://example.com/users?page=1",
      "from": 1,
      "last_page": 4,
      "last_page_url": "http://example.com/users?page=4",
      "links": [
        {
          "url": null,
          "label": "&laquo; Previous",
          "active": false
        },
        {
          "url": "http://example.com/users?page=1",
          "label": "1",
          "active": true
        },
        {
          "url": "http://example.com/users?page=2",
          "label": "2",
          "active": false
        },
        {
          "url": "http://example.com/users?page=3",
          "label": "3",
          "active": false
        },
        {
          "url": "http://example.com/users?page=4",
          "label": "4",
          "active": false
        },
        {
          "url": "http://example.com/users?page=5",
          "label": "5",
          "active": false
        },
        {
          "url": "http://example.com/users?page=2",
          "label": "Next &raquo;",
          "active": false
        }
      ],
      "next_page_url": "http://example.com/users?page=2",
      "path": "http://example.com/users",
      "per_page": 15,
      "prev_page_url": null,
      "to": 15,
      "total": 50
    }
    
    到目前為止,我們已經(jīng)研究了

    >和

    的方法,這些方法都使用了基於偏移的分頁(yè)?,F(xiàn)在,我們將查看使用基於光標(biāo)的分頁(yè)的
    <!-- Syntax highlighted by torchlight.dev -->select count(*) as aggregate from `users`
    
    >方法。

    > cursorPaginate作為一個(gè)頭部,基於光標(biāo)的分頁(yè)似乎有些混亂,當(dāng)您第一次遇到它時(shí)。因此,如果您不立即將其拿走,請(qǐng)不要擔(dān)心。希望在本文結(jié)尾,您將對(duì)它的工作原理有了更好的了解。我還將在本文的末尾留下一個(gè)很棒的視頻,該視頻更詳細(xì)地解釋了基於光標(biāo)的分頁(yè)。

    >

    >使用基於偏移的分頁(yè),我們使用paginatesimplePaginate>值從數(shù)據(jù)庫(kù)中獲取數(shù)據(jù)子集。因此,我們可以說(shuō)“跳過(guò)前10個(gè)記錄並獲取接下來(lái)的10個(gè)記錄”。這很容易理解且易於實(shí)現(xiàn)。儘管使用光標(biāo)分頁(yè),我們使用光標(biāo)(通常是數(shù)據(jù)庫(kù)中特定記錄的唯一標(biāo)識(shí)符)作為獲取上一組/下一組記錄的起點(diǎn)。例如,假設(shè)我們要查詢(xún)以獲取前15個(gè)用戶(hù)。我們假設(shè)第15個(gè)用戶(hù)的ID為20。當(dāng)我們要獲取接下來(lái)的15個(gè)用戶(hù)時(shí),我們將使用第15用戶(hù)(20)的ID作為光標(biāo)。我們將說(shuō)“獲取接下來(lái)的15個(gè)用戶(hù),ID大於20”。

    >

    >您有時(shí)可能會(huì)看到光標(biāo)稱(chēng)為“令牌”,“鍵”,“下一步”,“上一個(gè)”等。它們本質(zhì)上是對(duì)數(shù)據(jù)庫(kù)中特定記錄的參考。當(dāng)我們查看基礎(chǔ)SQL查詢(xún)時(shí),我們將在本節(jié)中稍後查看光標(biāo)的結(jié)構(gòu)。

    laravel允許我們輕鬆地使用基於光標(biāo)的分頁(yè)來(lái)使用

    >:> cursorPaginate

    >運(yùn)行上述代碼將導(dǎo)致字段是<!-- Syntax highlighted by torchlight.dev -->use App\Models\User; $users = User::query()->paginate(); >對(duì)象。此Paginator實(shí)例包含您需要在應(yīng)用程序中顯示分頁(yè)數(shù)據(jù)的所有信息。 >

    >類(lèi)似於$users>方法,該方法不會(huì)獲取數(shù)據(jù)集中的記錄總數(shù)。它僅知道當(dāng)前數(shù)據(jù)頁(yè)面以及是否還有更多記錄需要獲取,因此我們不立即意識(shí)到頁(yè)面或記錄的總數(shù)。 IlluminateContractsPaginationCursorPaginator> IlluminatePaginationCursorPaginator #using

    帶有刀片視圖

    simplePaginate>讓我們看一下如何在刀片視圖中呈現(xiàn)數(shù)據(jù)時(shí)如何使用cursorPaginate的方法。與我們以前的示例類(lèi)似,我們假設(shè)我們有一條簡(jiǎn)單的路由,可以以分頁(yè)的格式從數(shù)據(jù)庫(kù)中獲取用戶(hù),並將其傳遞給視圖:

    cursorPaginate刀片視圖可能看起來(lái)像這樣:

    cursorPaginate這將輸出一個(gè)類(lèi)似於以下幾個(gè)頁(yè)面:

    >
    <!-- Syntax highlighted by torchlight.dev -->use App\Models\User;
    use Illuminate\Support\Facades\Route;
    
    Route::get('users', function () {
        $users = User::query()->paginate();
    
        return view('users.index', [
            'users' => $users,
        ]);
    });
    

    <!-- Syntax highlighted by torchlight.dev --><html>
    <head>
        <title>Paginate</title>
        <script src="https://cdn.tailwindcss.com"></script>
    </head>
    
    <body>
        <div class="max-w-5xl mx-auto py-8">
            <h1 class="text-5xl">Paginate</h1>
    
            <ul class="py-4">
                @foreach ($users as $user)
                    <li class="py-1 border-b">{{ $user->name }}</li>
                @endforeach
            </ul>
    
            {{ $users->links() }}
        </div>
    </body>
    </html>
    
    正如我們所能看到的,由於

    方法沒(méi)有獲取數(shù)據(jù)集中的記錄總數(shù),因此的輸出與使用

    >方法時(shí)看到的輸出相似。我們僅在分頁(yè)鏈接中看到“上一個(gè)”和“下一個(gè)”鏈接。

    #using在API端點(diǎn)中

    laravel還允許您在API端點(diǎn)中使用

    >方法,並將自動(dòng)將頁(yè)上的數(shù)據(jù)轉(zhuǎn)換為我們的JSON。 cursorPaginate>讓我們構(gòu)建一個(gè)$users->links()端點(diǎn),以JSON格式返回分頁(yè)的用戶(hù):simplePaginate

    >當(dāng)我們碰到這條路線(xiàn)時(shí),我們將獲得類(lèi)似於以下內(nèi)容的JSON響應(yīng)(我將cursorPaginate>字段限制為僅3個(gè)記錄的簡(jiǎn)短):

    >
    <!-- Syntax highlighted by torchlight.dev -->use App\Models\User;
    
    $users = User::query()->paginate();
    
    如我們所見(jiàn),JSON響應(yīng)類(lèi)似於我們看到的先前響應(yīng),但差異很小。由於我們沒(méi)有獲取記錄的總數(shù),因此我們沒(méi)有響應(yīng)中的

    ,字段。您可能還注意到我們也沒(méi)有last_pagelast_page_url>字段。 links> 相反,我們有total>和from>字段,該字段包含數(shù)據(jù)的下一個(gè)和上一個(gè)數(shù)據(jù)頁(yè)面的光標(biāo)。由於我們?cè)诘谝豁?yè)上,因此to

    字段均為

    >。但是,設(shè)置了next_cursorprev_cursor字段。 prev_cursor> prev_page_urlnull字段是一個(gè)基本-64編碼的字符串,其中包含數(shù)據(jù)的下一頁(yè)的光標(biāo)。如果我們解碼next_cursor>字段,我們會(huì)得到這樣的東西(為可讀性而美化):> next_page_url

    光標(biāo)包含兩個(gè)單獨(dú)的信息:

    next_cursor next_cursor

    - 數(shù)據(jù)集中獲取的最後一個(gè)記錄的ID。
    <!-- Syntax highlighted by torchlight.dev -->use App\Models\User;
    use Illuminate\Support\Facades\Route;
    
    Route::get('users', function () {
        $users = User::query()->paginate();
    
        return view('users.index', [
            'users' => $users,
        ]);
    });
    
    >

    - 一個(gè)布爾值告訴我們光標(biāo)是指向下一組還是上一組項(xiàng)目。如果值為
      >,則意味著光標(biāo)應(yīng)用於獲取ID大於
    • >值的下一組記錄。如果該值為users.id,則意味著光標(biāo)應(yīng)用於以ID小於
    • value的ID進(jìn)行以下記錄集。 >。
    • _pointsToNextItems>讓我們看一下數(shù)據(jù)的第二頁(yè)可能是什麼樣子(再次縮短到3個(gè)記錄,以簡(jiǎn)化):true users.id false我們可以看到現(xiàn)在設(shè)置了users.id
    • >字段,並且已使用光標(biāo)更新了數(shù)據(jù)的下一頁(yè)。
    ?;A(chǔ)SQL查詢(xún)

    為了更好地了解光標(biāo)分頁(yè)在引擎蓋下的工作方式,讓我們看一下使用
    <!-- Syntax highlighted by torchlight.dev --><html>
    <head>
        <title>Paginate</title>
        <script src="https://cdn.tailwindcss.com"></script>
    </head>
    
    <body>
        <div class="max-w-5xl mx-auto py-8">
            <h1 class="text-5xl">Paginate</h1>
    
            <ul class="py-4">
                @foreach ($users as $user)
                    <li class="py-1 border-b">{{ $user->name }}</li>
                @endforeach
            </ul>
    
            {{ $users->links() }}
        </div>
    </body>
    </html>
    
    >方法時(shí)運(yùn)行的基礎(chǔ)SQL查詢(xún)。 在數(shù)據(jù)的第一頁(yè)上(包含15個(gè)記錄),將運(yùn)行以下SQL查詢(xún):>

    prev_cursor>我們可以看到,我們正在從prev_page_url>表中獲取前16個(gè)記錄,並按next_cursor列以升序順序訂購(gòu)。與next_page_url方法相似,我們要提取16行,因?yàn)槲覀兿氪_定是否還有更多記錄可以獲取。

    >

    >讓我們想像我們?nèi)会嵬ㄟ^(guò)以下光標(biāo)導(dǎo)航到項(xiàng)目的下一頁(yè):>

    當(dāng)該光標(biāo)被解碼時(shí),我們會(huì)得到以下JSON對(duì)象: cursorPaginate 然後,Laravel將運(yùn)行以下SQL查詢(xún)以獲取下一組記錄:>

    <!-- Syntax highlighted by torchlight.dev -->use App\Models\User;
    
    $users = User::query()->paginate();
    
    如我們所見(jiàn),我們從

    >表中獲取了下一16個(gè)記錄,該記錄大於15(因?yàn)?5是上一頁(yè)的最後一個(gè)ID)。 users現(xiàn)在,讓我們假設(shè)第2頁(yè)上的第一個(gè)用戶(hù)的ID是16。當(dāng)我們從第二頁(yè)導(dǎo)航回?cái)?shù)據(jù)的第一頁(yè)時(shí),將使用以下光標(biāo): id

    解碼時(shí),我們將獲得以下JSON對(duì)象:

    >當(dāng)我們轉(zhuǎn)到結(jié)果的下一頁(yè)時(shí),獲取的最後一個(gè)記錄被用作光標(biāo)。當(dāng)我們返回結(jié)果的上一頁(yè)時(shí),獲取的第一個(gè)記錄被用作光標(biāo)。因此,我們可以看到在光標(biāo)中設(shè)置為16。我們還可以看到
    <!-- Syntax highlighted by torchlight.dev -->use App\Models\User;
    use Illuminate\Support\Facades\Route;
    
    Route::get('users', function () {
        $users = User::query()->paginate();
    
        return view('users.index', [
            'users' => $users,
        ]);
    });
    
    >值設(shè)置為

    ,因?yàn)槲覀冋诨氐较惹暗捻?xiàng)目。

    。 結(jié)果,將運(yùn)行以下SQL查詢(xún)以獲取先前的記錄集:>
    <!-- Syntax highlighted by torchlight.dev --><html>
    <head>
        <title>Paginate</title>
        <script src="https://cdn.tailwindcss.com"></script>
    </head>
    
    <body>
        <div class="max-w-5xl mx-auto py-8">
            <h1 class="text-5xl">Paginate</h1>
    
            <ul class="py-4">
                @foreach ($users as $user)
                    <li class="py-1 border-b">{{ $user->name }}</li>
                @endforeach
            </ul>
    
            {{ $users->links() }}
        </div>
    </body>
    </html>
    

    >正如我們所看到的,users.id約束現(xiàn)在正在檢查_pointsToNextItems少於16的記錄(因?yàn)榈?頁(yè)上的第一個(gè)ID是16個(gè)),並且結(jié)果以降序排序。 false#使用分頁(yè)的API資源

    到目前為止,在我們的API示例中,我們剛剛直接從控制器返回了分頁(yè)數(shù)據(jù)。但是,在現(xiàn)實(shí)世界中,您可能需要在將數(shù)據(jù)返回給用戶(hù)之前處理。這可能是從添加或刪除字段,轉(zhuǎn)換數(shù)據(jù)類(lèi)型甚至將數(shù)據(jù)完全轉(zhuǎn)換為不同格式的任何方法。因此,您可能需要使用API??資源,因?yàn)樗鼈優(yōu)槟峁┝艘环N在返回?cái)?shù)據(jù)之前始終轉(zhuǎn)換數(shù)據(jù)的方法。

    Laravel

    允許您在分頁(yè)上使用API??資源。讓我們看一個(gè)如何做的示例。
    <!-- Syntax highlighted by torchlight.dev -->use App\Models\User;
    use Illuminate\Support\Facades\Route;
    
    Route::get('paginate', function () {
        return User::query()->paginate();
    });
    
    >

    想像我們已經(jīng)創(chuàng)建了一個(gè)API資源類(lèi),該類(lèi)別在返回之前會(huì)轉(zhuǎn)換用戶(hù)數(shù)據(jù)。它看起來(lái)像這樣:where id

    >在

    >方法中,我們定義,每當(dāng)我們通過(guò)此資源處理用戶(hù)時(shí),我們只想返回

    >,

    > fields。

    現(xiàn)在,讓我們?cè)谖覀兊?/p>>文件中構(gòu)建一個(gè)簡(jiǎn)單的API端點(diǎn),該文件使用

    AppHttpResourcesUserResource返回了分頁(yè)的用戶(hù)

    <!-- Syntax highlighted by torchlight.dev -->{
      "current_page": 1,
      "data": [
        {
          "id": 1,
          "name": "Andy Runolfsson",
          "email": "teresa.wiegand@example.net",
          "email_verified_at": "2024-10-15T23:19:28.000000Z",
          "created_at": "2024-10-15T23:19:29.000000Z",
          "updated_at": "2024-10-15T23:19:29.000000Z"
        },
        {
          "id": 2,
          "name": "Rafael Cummings",
          "email": "odessa54@example.org",
          "email_verified_at": "2024-10-15T23:19:28.000000Z",
          "created_at": "2024-10-15T23:19:29.000000Z",
          "updated_at": "2024-10-15T23:19:29.000000Z"
        },
        {
          "id": 3,
          "name": "Reynold Lindgren",
          "email": "juwan.johns@example.net",
          "email_verified_at": "2024-10-15T23:19:28.000000Z",
          "created_at": "2024-10-15T23:19:29.000000Z",
          "updated_at": "2024-10-15T23:19:29.000000Z"
        }
      ],
      "first_page_url": "http://example.com/users?page=1",
      "from": 1,
      "last_page": 4,
      "last_page_url": "http://example.com/users?page=4",
      "links": [
        {
          "url": null,
          "label": "&laquo; Previous",
          "active": false
        },
        {
          "url": "http://example.com/users?page=1",
          "label": "1",
          "active": true
        },
        {
          "url": "http://example.com/users?page=2",
          "label": "2",
          "active": false
        },
        {
          "url": "http://example.com/users?page=3",
          "label": "3",
          "active": false
        },
        {
          "url": "http://example.com/users?page=4",
          "label": "4",
          "active": false
        },
        {
          "url": "http://example.com/users?page=5",
          "label": "5",
          "active": false
        },
        {
          "url": "http://example.com/users?page=2",
          "label": "Next &raquo;",
          "active": false
        }
      ],
      "next_page_url": "http://example.com/users?page=2",
      "path": "http://example.com/users",
      "per_page": 15,
      "prev_page_url": null,
      "to": 15,
      "total": 50
    }
    
    >在上面的代碼中,我們從數(shù)據(jù)庫(kù)中獲取了一個(gè)用戶(hù)(假設(shè)它是包含15個(gè)用戶(hù)的第一頁(yè))的單個(gè)頁(yè)面。然後,我們將

    字段(將是toArray>的實(shí)例)傳遞給id>方法。此方法將在將其退還給用戶(hù)之前使用name轉(zhuǎn)換分頁(yè)的數(shù)據(jù)。

    >當(dāng)我們擊中/api/users端點(diǎn)時(shí),我們將獲得類(lèi)似於以下內(nèi)容的JSON響應(yīng)(我將data>字段限制為僅3個(gè)記錄的簡(jiǎn)短記錄):

    >
    <!-- Syntax highlighted by torchlight.dev -->use App\Models\User;
    
    $users = User::query()->paginate();
    
    正如我們?cè)谏厦娴腏SON中看到的那樣,Laravel檢測(cè)到我們正在使用分頁(yè)數(shù)據(jù)集,並以與以前相似的格式返回分頁(yè)數(shù)據(jù)。但是,這一次,

    >字段中的用戶(hù)僅包含我們?cè)贏PI資源類(lèi)中指定的data>,idname>字段。其他字段(emailcurrent_page,fromlast_page,linkspath,per_pagetototal)仍被返回,因?yàn)樗鼈兪欠猪?yè)數(shù)據(jù)的一部分,但它們已放置在meta>字段中。還有一個(gè)包含links,firstlast的字段,prev>鏈接到數(shù)據(jù)的不同頁(yè)面。 next #Changing每個(gè)頁(yè)面值

    >使用分頁(yè)數(shù)據(jù)構(gòu)建視圖時(shí),您可能需要允許用戶(hù)更改每個(gè)頁(yè)面顯示的記錄數(shù)量。這可能是通過(guò)下拉列表或數(shù)字輸入字段。

    > Laravel使通過(guò)將A

    >參數(shù)傳遞到

    >,

    perPage>方法來(lái)更改每個(gè)頁(yè)面顯示的記錄數(shù)量變得容易。此參數(shù)允許您指定要顯示每個(gè)頁(yè)面的記錄數(shù)。 simplePaginate> paginate>讓我們看一個(gè)簡(jiǎn)單的示例,說(shuō)明如何讀取acursorPaginate查詢(xún)參數(shù)並使用它來(lái)更改每頁(yè)獲取的記錄數(shù)量:

    per_page在上面的示例中,我們正在抓取

    QUERY參數(shù)的值。如果未提供該值,我們將默認(rèn)為10。然後,我們將該值傳遞給
    <!-- Syntax highlighted by torchlight.dev -->use App\Models\User;
    use Illuminate\Support\Facades\Route;
    
    Route::get('users', function () {
        $users = User::query()->paginate();
    
        return view('users.index', [
            'users' => $users,
        ]);
    });
    
    >方法的

    參數(shù)。 然後,我們可以訪(fǎng)問(wèn)這些不同的URL:> per_page perPagepaginate - 顯示用戶(hù)的第一頁(yè),每頁(yè)10個(gè)記錄。 >

    - 顯示用戶(hù)的首頁(yè),每頁(yè)5個(gè)記錄。 >

      - 顯示用戶(hù)的第二頁(yè),每頁(yè)5個(gè)記錄。 >
    • 等等...https://my-app.com/users
    • #如何決定要使用哪種分頁(yè)方法https://my-app.com/users?per_page=5
    • >現(xiàn)在我們已經(jīng)研究了分頁(yè)的不同類(lèi)型以及如何在Laravel中使用它們,我們將討論如何確定在您的應(yīng)用程序中使用的哪種方法。 >
    • #do您需要頁(yè)碼或記錄總數(shù)? https://my-app.com/users?per_page=5&page=2>
    • 如果您要構(gòu)建需要顯示的記錄或頁(yè)面總數(shù)或頁(yè)面的UI或API端點(diǎn),則
    • >方法可能是一個(gè)明智的選擇。
    • >

      如果您不需要任何一個(gè),則simplePaginatecursorPaginate將會(huì)更有效,因?yàn)樗鼈儧](méi)有執(zhí)行不必要的查詢(xún)來(lái)計(jì)算記錄總數(shù)。 >

      #do您需要跳到特定頁(yè)面?

      >

      如果您需要能夠跳到特定的數(shù)據(jù)頁(yè)面,則基於偏移的分頁(yè)更合適。由於光標(biāo)分頁(yè)是有狀態(tài)的,因此它依靠上一頁(yè)知道下一步要去哪裡。因此,跳到特定頁(yè)面並不容易。

      >

      >使用偏移分頁(yè)時(shí),您通常只需傳遞請(qǐng)求中的頁(yè)碼(也許作為查詢(xún)參數(shù)),然後跳到該頁(yè)面而不具有上一頁(yè)的任何上下文。

      #wath是多大的數(shù)據(jù)集?

      >

      由於數(shù)據(jù)庫(kù)處理

      >值的方式,基於偏移的分頁(yè)隨著頁(yè)碼的增加而變得效率降低。這是因?yàn)楫?dāng)您使用偏移量時(shí),數(shù)據(jù)庫(kù)仍然必須掃描所有記錄,直至偏移值。他們只是被丟棄,在查詢(xún)結(jié)果中沒(méi)有返回。

      > offset這是一篇很棒的文章,可以更詳細(xì)地解釋這一點(diǎn):https://use-the-index-luke.com/no-offset。

      因此,隨著數(shù)據(jù)庫(kù)中數(shù)據(jù)總數(shù)的增長(zhǎng)和頁(yè)數(shù)增加,基於偏移的分頁(yè)的效率也降低了。在這些情況下,基於光標(biāo)的分頁(yè)的性能更高,尤其是在索引光標(biāo)字段的情況下,因?yàn)橄惹暗挠涗浳醋x取。因此,如果您要針對(duì)大型數(shù)據(jù)集使用分頁(yè),您可能需要選擇光標(biāo)分頁(yè)而不是偏移分頁(yè)。

      #是可能經(jīng)常更改的數(shù)據(jù)集嗎?

      如果請(qǐng)求之間的基礎(chǔ)數(shù)據(jù)集更改,則基於偏移的分頁(yè)可能會(huì)遇到問(wèn)題。

      。

      讓我們來(lái)看看一個(gè)例子。

      是說(shuō)我們數(shù)據(jù)庫(kù)中有以下10個(gè)用戶(hù):

      >

      用戶(hù)1

      用戶(hù)2
      • 用戶(hù)3
      • 用戶(hù)4
      • >用戶(hù)5
      • 用戶(hù)6
      • 用戶(hù)7
      • 用戶(hù)8
      • >用戶(hù)9
      • 用戶(hù)10
      • 我們提出請(qǐng)求獲取第一頁(yè)(包含5個(gè)用戶(hù))並獲取以下用戶(hù):>
      • 用戶(hù)1

      用戶(hù)2

        用戶(hù)3
      • 用戶(hù)4
      • >用戶(hù)5
      • >當(dāng)我們導(dǎo)航到第2頁(yè)時(shí),我們希望將用戶(hù)6到10。但是,讓我們想像,在加載第2頁(yè)之前(當(dāng)我們?nèi)栽诓榭吹?頁(yè)時(shí)),從數(shù)據(jù)庫(kù)中刪除了用戶(hù)1。由於頁(yè)面大小為5,因此獲取下一頁(yè)的查詢(xún)看起來(lái)像:
      • >
      • 這意味著我們要跳過(guò)前5個(gè)記錄並獲取下一個(gè)5.
      這將導(dǎo)致包含以下用戶(hù)的第2頁(yè):

      <!-- Syntax highlighted by torchlight.dev -->use App\Models\User;
      
      $users = User::query()->paginate();
      
      用戶(hù)7

      用戶(hù)8

      >用戶(hù)9
      • 用戶(hù)10
      • 正如我們所看到的,列表中缺少用戶(hù)6。這是因?yàn)橛脩?hù)6現(xiàn)在是表中的第五個(gè)記錄,因此它們實(shí)際上是在第一頁(yè)上。
      • >基於光標(biāo)的分頁(yè)沒(méi)有這個(gè)問(wèn)題,因?yàn)槲覀儧](méi)有跳過(guò)記錄,我們只是根據(jù)光標(biāo)獲取下一組記錄。讓我們想像我們?cè)谏厦娴氖纠惺褂昧嘶豆鈽?biāo)的分頁(yè)。第2頁(yè)的光標(biāo)將是用戶(hù)5的ID(我們假設(shè)為5),因?yàn)樗鞘醉?yè)上的最後一個(gè)記錄。因此,我們對(duì)第2頁(yè)的查詢(xún)可能看起來(lái)像這樣:

        <!-- Syntax highlighted by torchlight.dev -->use App\Models\User;
        
        $users = User::query()->paginate();
        
        運(yùn)行上述查詢(xún)將按預(yù)期返回6至10的用戶(hù)。

        >

        >這應(yīng)該有望突出顯示基於偏移的分頁(yè)如何在讀取基礎(chǔ)數(shù)據(jù),添加或刪除的基礎(chǔ)數(shù)據(jù)時(shí)如何成為問(wèn)題。它變得不可預(yù)測(cè),並可能導(dǎo)致意外的結(jié)果。

        >

        #您要構(gòu)建API?

        >

        >重要的是要記住,您沒(méi)有固定在應(yīng)用程序中使用單一類(lèi)型的分頁(yè)。在某些地方,偏移分頁(yè)可能更合適(也許是為了UI目的),而在其他地方,光標(biāo)分頁(yè)可能更有效(例如,使用大型數(shù)據(jù)集時(shí))。因此,您可以根據(jù)用例中的應(yīng)用程序混合和匹配分頁(yè)方法。

        > 但是,如果您要構(gòu)建API,我強(qiáng)烈建議您保持一致,並為所有端點(diǎn)使用單個(gè)分頁(yè)方法。這將使開(kāi)發(fā)人員更容易理解如何使用API??並避免任何混亂。 >

        >您不希望他們記住哪些端點(diǎn)使用偏移 - 流動(dòng)以及哪些端點(diǎn)使用光標(biāo) -

        當(dāng)然,這不是一個(gè)艱難而快速的規(guī)則。如果您確實(shí)需要在一個(gè)特定端點(diǎn)中使用其他分頁(yè)方法,請(qǐng)繼續(xù)。但是,只要確保在文檔中清楚地表明它,以使開(kāi)發(fā)人員更容易理解。

        #prefer視頻?

        >

        >如果您更像是一個(gè)視覺(jué)學(xué)習(xí)者,則可能需要查看Aaron Francis的這個(gè)很棒的視頻,該視頻會(huì)更詳細(xì)地解釋基於偏移和基於Cursor的分頁(yè)之間的區(qū)別:>

        #conclusion

        在本文中,我們研究了Laravel中不同類(lèi)型的分頁(yè)以及如何使用它們。我們還研究了他們的基礎(chǔ)SQL查詢(xún)以及如何確定在您的應(yīng)用程序中使用的分頁(yè)方法。 希望您現(xiàn)在應(yīng)該更有信心在Laravel應(yīng)用程序中使用分頁(yè)。

以上是Laravel的分頁(yè)指南的詳細(xì)內(nèi)容。更多資訊請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請(qǐng)聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線(xiàn)上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開(kāi)發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)程式碼編輯軟體(SublimeText3)

熱門(mén)話(huà)題

如何將兩個(gè)PHP陣列組合獨(dú)特的值? 如何將兩個(gè)PHP陣列組合獨(dú)特的值? Jul 02, 2025 pm 05:18 PM

要合併兩個(gè)PHP數(shù)組並保留唯一值,有兩種主要方法。 1.對(duì)於索引數(shù)組或僅需值去重的情況,使用array_merge和array_unique組合:先用array_merge($array1,$array2)合併數(shù)組,再用array_unique()去重,最終得到包含所有唯一值的新數(shù)組;2.對(duì)於關(guān)聯(lián)數(shù)組且希望保留第一個(gè)數(shù)組中的鍵值對(duì)時(shí),使用 運(yùn)算符:$result=$array1 $array2,這將確保第一個(gè)數(shù)組中的鍵不會(huì)被第二個(gè)數(shù)組覆蓋。這兩種方法分別適用於不同場(chǎng)景,根據(jù)是否需要保留鍵名或只關(guān)注

PHP正則密碼強(qiáng)度 PHP正則密碼強(qiáng)度 Jul 03, 2025 am 10:33 AM

判斷密碼強(qiáng)度需結(jié)合正則與邏輯處理,基礎(chǔ)要求包括:1.長(zhǎng)度不少於8位;2.至少含小寫(xiě)字母、大寫(xiě)字母、數(shù)字;3.可加入特殊字符限制;進(jìn)階方面需避免連續(xù)重複字符及遞增/遞減序列,這需PHP函數(shù)檢測(cè);同時(shí)應(yīng)引入黑名單過(guò)濾常見(jiàn)弱密碼如password、123456;最終建議結(jié)合zxcvbn庫(kù)提升評(píng)估精度。

如何在PHP中牢固地處理文件上傳? 如何在PHP中牢固地處理文件上傳? Jul 08, 2025 am 02:37 AM

要安全處理PHP文件上傳需驗(yàn)證來(lái)源與類(lèi)型、控製文件名與路徑、設(shè)置服務(wù)器限制並二次處理媒體文件。 1.驗(yàn)證上傳來(lái)源通過(guò)token防止CSRF並通過(guò)finfo_file檢測(cè)真實(shí)MIME類(lèi)型使用白名單控制;2.重命名文件為隨機(jī)字符串並根據(jù)檢測(cè)類(lèi)型決定擴(kuò)展名存儲(chǔ)至非Web目錄;3.PHP配置限制上傳大小及臨時(shí)目錄Nginx/Apache禁止訪(fǎng)問(wèn)上傳目錄;4.GD庫(kù)重新保存圖片清除潛在惡意數(shù)據(jù)。

PHP變量範(fàn)圍解釋了 PHP變量範(fàn)圍解釋了 Jul 17, 2025 am 04:16 AM

PHP變量作用域常見(jiàn)問(wèn)題及解決方法包括:1.函數(shù)內(nèi)部無(wú)法訪(fǎng)問(wèn)全局變量,需使用global關(guān)鍵字或參數(shù)傳入;2.靜態(tài)變量用static聲明,只初始化一次並在多次調(diào)用間保持值;3.超全局變量如$_GET、$_POST可在任何作用域直接使用,但需注意安全過(guò)濾;4.匿名函數(shù)需通過(guò)use關(guān)鍵字引入父作用域變量,修改外部變量則需傳遞引用。掌握這些規(guī)則有助於避免錯(cuò)誤並提升代碼穩(wěn)定性。

在PHP中評(píng)論代碼 在PHP中評(píng)論代碼 Jul 18, 2025 am 04:57 AM

PHP註釋代碼常用方法有三種:1.單行註釋用//或#屏蔽一行代碼,推薦使用//;2.多行註釋用/.../包裹代碼塊,不可嵌套但可跨行;3.組合技巧註釋如用/if(){}/控制邏輯塊,或配合編輯器快捷鍵提升效率,使用時(shí)需注意閉合符號(hào)和避免嵌套。

撰寫(xiě)PHP評(píng)論的提示 撰寫(xiě)PHP評(píng)論的提示 Jul 18, 2025 am 04:51 AM

寫(xiě)好PHP註釋的關(guān)鍵在於明確目的與規(guī)範(fàn),註釋?xiě)?yīng)解釋“為什麼”而非“做了什麼”,避免冗餘或過(guò)於簡(jiǎn)單。 1.使用統(tǒng)一格式,如docblock(/*/)用於類(lèi)、方法說(shuō)明,提升可讀性與工具兼容性;2.強(qiáng)調(diào)邏輯背後的原因,如說(shuō)明為何需手動(dòng)輸出JS跳轉(zhuǎn);3.在復(fù)雜代碼前添加總覽性說(shuō)明,分步驟描述流程,幫助理解整體思路;4.合理使用TODO和FIXME標(biāo)記待辦事項(xiàng)與問(wèn)題,便於後續(xù)追蹤與協(xié)作。好的註釋能降低溝通成本,提升代碼維護(hù)效率。

發(fā)電機(jī)如何在PHP中工作? 發(fā)電機(jī)如何在PHP中工作? Jul 11, 2025 am 03:12 AM

AgeneratorinPHPisamemory-efficientwaytoiterateoverlargedatasetsbyyieldingvaluesoneatatimeinsteadofreturningthemallatonce.1.Generatorsusetheyieldkeywordtoproducevaluesondemand,reducingmemoryusage.2.Theyareusefulforhandlingbigloops,readinglargefiles,or

如何在PHP中創(chuàng)建數(shù)組? 如何在PHP中創(chuàng)建數(shù)組? Jul 02, 2025 pm 05:01 PM

在PHP中創(chuàng)建數(shù)組的方法有兩種:使用array()函數(shù)或使用中括號(hào)[]。 1.使用array()函數(shù)是傳統(tǒng)方式,兼容性好,定義索引數(shù)組如$fruits=array("apple","banana","orange"),關(guān)聯(lián)數(shù)組如$user=array("name"=>"John","age"=>25);2.使用[]是從PHP5.4開(kāi)始支持的更簡(jiǎn)潔的方式,如$color

See all articles