a-blog cms PHP API Reference

EntryRepository
in package

エントリーのリポジトリ

Table of Contents

Constants

ASSIGN_CHUNK_SIZE  = 500
1 本の CASE 式 UPDATE に載せる行数の上限
SHIFT_CHUNK_SIZE  = 1000
1 本の算術 UPDATE に載せるエントリーIDの上限

Methods

findSortOrder()  : array<int, array{id: int, sort: int}>
指定したスコープのエントリーIDと表示順を、表示順・エントリーIDの昇順で取得する
nextCategorySort()  : int
次のカテゴリー絞り込み時の表示順を取得
nextSort()  : int
次の表示順を取得
nextUserSort()  : int
次のユーザー絞り込み時の表示順を取得
updateSortOrder()  : void
表示順をまとめて更新する
executeSortOrderUpdate()  : void
表示順の UPDATE を実行する

Constants

ASSIGN_CHUNK_SIZE

1 本の CASE 式 UPDATE に載せる行数の上限

private mixed ASSIGN_CHUNK_SIZE = 500

1 行あたり WHEN 側と THEN 側で 2 つのプレースホルダを使うため、上限を上げすぎると バインド変数の上限に近づく。数百行単位に分割するのが一般的な目安。

SHIFT_CHUNK_SIZE

1 本の算術 UPDATE に載せるエントリーIDの上限

private mixed SHIFT_CHUNK_SIZE = 1000

Methods

findSortOrder()

指定したスコープのエントリーIDと表示順を、表示順・エントリーIDの昇順で取得する

public findSortOrder("entry_sort"|"entry_user_sort"|"entry_category_sort" $sortField, int $blogId, int|null $userId, int|null $categoryId) : array<int, array{id: int, sort: int}>

管理画面の一覧と同じ並び(ACMS_Filter::entryOrder + id の第2キー)を再現するため、 表示順が重複していても取得順が一意に定まる。

Parameters
$sortField : "entry_sort"|"entry_user_sort"|"entry_category_sort"
$blogId : int
$userId : int|null

entry_user_sort のときのスコープ

$categoryId : int|null

entry_category_sort のときのスコープ(カテゴリー未設定は null)

Return values
array<int, array{id: int, sort: int}>

nextCategorySort()

次のカテゴリー絞り込み時の表示順を取得

public nextCategorySort(int|null $categoryId, int $blogId) : int
Parameters
$categoryId : int|null
$blogId : int
Return values
int

nextSort()

次の表示順を取得

public nextSort(int $blogId) : int
Parameters
$blogId : int
Return values
int

nextUserSort()

次のユーザー絞り込み時の表示順を取得

public nextUserSort(int $userId, int $blogId) : int
Parameters
$userId : int
$blogId : int
Return values
int

updateSortOrder()

表示順をまとめて更新する

public updateSortOrder("entry_sort"|"entry_user_sort"|"entry_category_sort" $sortField, int $blogId, array<int, array{type: "shift", delta: int, entryIds: list}|array{type: "assign", values: array}> $plan) : void

SortOrder::buildUpdatePlan() が分解した単位で書き込む。差分が一定の区間は 「表示順に一定値を足す」1 本の UPDATE で、それ以外は CASE 式の一括 UPDATE で処理する。 1 行ずつ UPDATE を撃つと、長距離移動や重複解消で数百文を発行することになり、 トランザクション内で行ロックを保持する時間も伸びる。

Parameters
$sortField : "entry_sort"|"entry_user_sort"|"entry_category_sort"
$blogId : int
$plan : array<int, array{type: "shift", delta: int, entryIds: list}|array{type: "assign", values: array}>
Tags
throws
RuntimeException

更新に失敗した場合(トランザクションをロールバックさせる)

executeSortOrderUpdate()

表示順の UPDATE を実行する

private executeSortOrderUpdate(SQL_Update $sql) : void

DB::query() は失敗時に例外ではなく false を返すため、戻り値を検査して例外に変える。 1 文で数百行を書き換えるので、黙って失敗するとトランザクションがコミットされて 並び順が中途半端な状態で残ってしまう。

Parameters
$sql : SQL_Update
Tags
throws
RuntimeException

        
On this page

Search results