gpt4 book ai didi

Laravel 保存 Eloquent 模型的有序列表

转载 作者:行者123 更新时间:2023-12-04 01:05:22 25 4
gpt4 key购买 nike

我正在创建一个食物菜单,管理员可以通过拖放来订购/排序。这个菜单由多个类别(ProductCategory)和产品(Product)组成。
我正在使用 HTML5Sortable在客户端允许嵌套 d&d。标记非常简单:

<div class="categories">
@foreach($categories as $category)
<div class="category">
@foreach($category->products as $product)
<div class="products">
<div class=""product" data=id="{{ $product->id }}">
{{ $product->name }}
</div>
</div><!-- /products !-->
@endforeach
</div><!-- /category !-->
@endforeach
</div>
以及相应的javascript:
$('.categories').sortable({
items: '.category'
});
$('.products').sortable({
items: '.product'
});

// Will be called when the user is done repositioning the products and categories
function getOrderedList() {
var data = {};

$('.categories').find('.category').map(function(i) {
var category = $(this);
data[i] = {};
data[i].id = category.data('id');
data[i].products = category.find('.product').map(function() {
return $(this).data('id');
}).get();
});

data = JSON.stringify(data); // Send data to server
}
函数 getOrderedList将向 Laravel 发送一个 JSON 字符串,其中包含已排序的类别 ID 和产品 ID:
{"0":{"id":1,"products":[2,3,1,4,5,6,7,8,9,10]},"1":{"id":2,"products":[11,12,13,14]},"2":{"id":3,"products":[15,16,17,18]}}
我将如何在后端进行这项工作?我想我必须将此数组存储在数据库中的某个位置,然后按 id 查找和排序模型?
简而言之:用于排序(嵌套)模型(在 Laravel 中)的干净且灵活的解决方案是什么?

最佳答案

一个常见的约定是Weight,在products表上添加一个叫(Int)Weight的字段,用来定义物品的顺序。

一旦订单发生变化,您只需更新重量字段。

当您检索项目时,您可以按重量对它们进行排序。

它变得类似于一个数组

Id        Name            Weight
01 'product 1' 2
02 'product 2' 0
03 'product 3' 1

当您按重量订购时,您会得到
product 2
product 3
product 1

它类似于数组,因为
$products[0] = 'product 2'
$products[1] = 'product 3'
$products[2] = 'product 1'

请注意,如果您想让它更多 动态 ,可以创建一个可以满足多个模型的多态模型。

请引用 https://laravel.com/docs/5.1/eloquent-relationships#many-to-many-polymorphic-relations

多态关系示例

创建表 重量 (迁移示例)
$table->increments('id');
$table->integer('value');
$table->integer('weightable_id')->unsigned();
$table->string('weightable_type');

创建模型 重量
class Weight extends Eloquent
{
public function weightable()
{
return $this->morphTo();
}
}

现在使用任何其他型号
class Products extends Eloquent
{
...
public function weight()
{
return $this->morphOne(Weight::class);
}
}

这样您就可以将该方法添加到您想要的任何模型中,然后您就可以用它对模型进行排序。

附言确保任何使用它的模型在创建模型后立即创建该关系

我不推荐这种方法,如果您在 Products 表中明确定义 weight 字段会更好,我理解您希望代码是动态的,但一切都是有代价的

性能下降,一旦建立多态关系就不容易可视化您的代码,更像是开始使用 Jumps 而不是 Functions

关于Laravel 保存 Eloquent 模型的有序列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34579485/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com