kirillemko / yii2-order-behavior
管理模型订单
Requires
- yiisoft/yii2: *
This package is auto-updated.
Last update: 2024-09-25 16:24:24 UTC
README
此扩展为ActiveRecord自定义记录排序设置提供支持。
安装
通过composer安装此扩展是首选方式。
运行以下命令:
php composer.phar require --prefer-dist kirillemko/order-behavior
或添加以下内容到您的composer.json文件的require部分:
"kirillemko/order-behavior": "*"
用法
此扩展通过基于列的位置索引支持自定义记录的排序设置。
此扩展为Yii2中的此类解决方案提供支持,提供了[[\kirillemko\ar\position\OrderBehavior]] ActiveRecord行为。您可以通过以下方式将其附加到模型类:
class Item extends ActiveRecord { public function behaviors() { return [ 'positionBehavior' => [ 'class' => OrderBehavior::className(), 'positionAttribute' => 'order', ], ]; } }
行为使用数据库实体特定的整数字段来设置位置索引。因此,模型所引用的数据库实体必须包含[[positionAttribute]]字段。
为了按正确顺序显示自定义列表,您应该按[[positionAttribute]]升序排序
$records = Item::find()->orderBy(['position' => SORT_ASC])->all(); foreach ($records as $record) { echo $record->position . ', '; } // outputs: 1, 2, 3, 4, 5,...
位置保存
附加后,行为自动填充新记录的positionAttribute
值,将其放置在列表末尾
echo Item::find()->count(); // outputs: 4 $item = new Item(); $item->save(); echo $item->position // outputs: 5
但是,您也可以明确设置新记录的位置
echo Item::find()->count(); // outputs: 4 $item = new Item(); $item->position = 2; // enforce position '2' $item->save(); echo $item->position // outputs: 2 !!!
位置切换
可以使用以下方法将现有记录移动到另一个位置:
- [[movePrev()]] - 将记录向列表开头移动一个位置。
- [[moveNext()]] - 将记录向列表末尾移动一个位置。
- [[moveFirst()]] - 将记录移动到列表开头。
- [[moveLast()]] - 将记录移动到列表末尾。
- [[moveToPosition()]] - 将所有者记录移动到特定位置。
您还可以通过直接提供给positionAttribute
的属性来更改记录的位置
$item = Item::find()->andWhere(['position' => 3])->one(); $item->position = 5; // switch position to '5' $item->save();
组内位置
有时单个数据库实体包含多个列表,这些列表需要自定义排序,通过分组属性逻辑上分离。例如:FAQ问题可以按类别分组,而单个类别中的问题应手动排序。在这种情况下,可以使用[[\yii2tech\ar\position\PositionBehavior::$groupAttributes]]
class FaqQuestion extends ActiveRecord { public function behaviors() { return [ 'positionBehavior' => [ 'class' => PositionBehavior::className(), 'positionAttribute' => 'position', 'groupAttributes' => [ 'categoryId' // multiple lists varying by 'categoryId' ], ], ]; } }
在这种情况下,行为将使用groupAttributes
的所有者值作为位置计算和更改的附加条件
echo FaqQuestion::find()->andWhere(['categoryId' => 1])->count(); // outputs: '4' echo FaqQuestion::find()->andWhere(['categoryId' => 2])->count(); // outputs: '7' $record = new FaqQuestion(); $record->categoryId = 1; $record->save(); echo $record->position // outputs: '5' $record = new FaqQuestion(); $record->categoryId = 2; $record->save(); echo $record->position // outputs: '8'
列表导航
应用了自定义位置顺序的记录将形成一个链式列表,您可以根据需要导航。您可以使用[[\yii2tech\ar\position\PositionBehavior::getIsFirst()]]和[[\yii2tech\ar\position\PositionBehavior::getIsLast()]]方法确定特定记录是否是列表中的第一个或最后一个。例如
echo Item::find()->count(); // outputs: 10 $firstItem = Item::find()->andWhere(['position' => 1])->one(); echo $firstItem->getIsFirst(); // outputs: true echo $firstItem->getIsLast(); // outputs: false $lastItem = Item::find()->andWhere(['position' => 10])->one(); echo $lastItem->getIsFirst(); // outputs: false echo $lastItem->getIsLast(); // outputs: true
有一个特定的记录实例,您可以使用[[\yii2tech\ar\position\PositionBehavior::getNext()]]或[[\yii2tech\ar\position\PositionBehavior::getPrev()]]方法始终找到位于其之前或之后的记录。例如
$item = Item::find()->andWhere(['position' => 5])->one(); $nextItem = $item->findNext(); echo $nextItem->position; // outputs: 6 $prevItem = $item->findPrev(); echo $prevItem->position; // outputs: 4
您还可以获取列表中的第一个和最后一个记录。例如
echo Item::find()->count(); // outputs: 10 $item = Item::find()->andWhere(['position' => 5])->one(); $firstItem = $item->findFirst(); echo $firstItem->position; // outputs: 1 $lastItem = $item->findLast(); echo $lastItem->position; // outputs: 10