Php 拉雷维尔。如何处理排序顺序列移位
我有这样一个表,和表示它的Php 拉雷维尔。如何处理排序顺序列移位,php,laravel,laravel-5.5,laravel-eloquent,Php,Laravel,Laravel 5.5,Laravel Eloquent,我有这样一个表,和表示它的SomeModel | id | name | sort_order | | --------------- | ---------------- | ---------------- | | 1 | A | 1 | | 2 | B | 2
SomeModel
| id | name | sort_order |
| --------------- | ---------------- | ---------------- |
| 1 | A | 1 |
| 2 | B | 2 |
| 3 | C | 3 |
| 4 | D | 8 |
我正在为这个表实现一个API。插入相同值时如何正确处理列移位
例如:
我想保存这样一个对象:
{
"name": "B2",
"sort_order": 2
}
并收到这样一张表格:
| id | name | sort_order |
| --------------- | ---------------- | ---------------- |
| 1 | A | 1 |
| 5 | B2 | 2 |
| 2 | B | 3 | <--- initially was 2
| 3 | C | 4 | <--- initially was 3
| 4 | D | 8 |
| id | name |排序||
| --------------- | ---------------- | ---------------- |
|1 | A | 1|
|5 | B2 | 2|
|2 | B | 3 |我会这样做:
use App\SomeModel;
use Illuminate\Http\Request;
public function insert_data(Request $request){
SomeModel::where("sort_order", ">=", $request->sort_order)->increment("sort_order");
SomeModel::create($request->all());
}
由于您有一些模型,因此可以执行以下操作:
在您的AppServiceProvider中
Event::listen("eloquent.inserting: ".SomeModel::class, function (SomeModel $model) {
SomeModel::where("sort_order", ">=", $model->sort_order)
->update([ "sort_order" => \DB::raw("sort_order+1") ])
});
其思想是更新所有其他模型,使其排序顺序高于或等于插入的模型,并将其递增一。您可能希望执行类似的操作,包括删除事件来填补空白,或者更新事件来交换排序顺序
您可以(也应该)通过阅读
当然,您可以始终将sort_order列设置为unique,并创建一个DB触发器来检查排序顺序,这可能会更好,因为这是一个数据完整性问题 你能解释一下这个示例对象是什么意思吗?这是无效的json,重复键是这样的。对象
不清楚,请清除您实际需要的内容?@btl@bharat不管怎样。php数组、php对象等等。我的问题不在于格式,而在于改变其他型号的排序顺序。关于“具有重复密钥的无效json”。很抱歉愚蠢的复制粘贴错误。