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
intnextSort()
次の表示順を取得
public
nextSort(int $blogId) : int
Parameters
- $blogId : int
Return values
intnextUserSort()
次のユーザー絞り込み時の表示順を取得
public
nextUserSort(int $userId, int $blogId) : int
Parameters
- $userId : int
- $blogId : int
Return values
intupdateSortOrder()
表示順をまとめて更新する
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
executeSortOrderUpdate()
表示順の UPDATE を実行する
private
executeSortOrderUpdate(SQL_Update $sql) : void
DB::query() は失敗時に例外ではなく false を返すため、戻り値を検査して例外に変える。 1 文で数百行を書き換えるので、黙って失敗するとトランザクションがコミットされて 並び順が中途半端な状態で残ってしまう。
Parameters
- $sql : SQL_Update