对于我的Laravel应用程序,我已经实现了排序功能。在选项列表中,我显示了两个按钮(向上和向下),这些按钮在OptionController中触发向上和向下的功能(见下文)。
问题1
目前,我正在为数据库中的排序列设置一个DECIMAL(30,15)字段。我随机选择30,15。您能给我一个建议吗,哪种DECIMAL(?,?)最适合此排序字段?
问题2
我想将up
和down
逻辑移动到一个地方,在这里我可以在具有通用模型(例如Sort::up($models, $item
)的不同控制器中使用它。放置这样的逻辑的正确位置是什么?服务?辅助功能? ...?
问题3
当我创建一个新项目(例如下面示例中的选项)时,我需要将排序自动设置为最后一个项目的排序+1。当然,我可以在存储它时在控制器中执行此操作,但是可以我将这种逻辑应用于模型本身吗?并且:在哪里可以将此逻辑用于多个模型而不重复代码?
namespace App\Http\Controllers;
use App\Models\Option;
use App\Models\Attribute;
class OptionController extends Controller
{
public function up($id, $attributeId) {
$options = Attribute::findOrFail($attributeId)->options;
$option = Option::findOrFail($id);
foreach ($options as $index => $o) {
// Search for the current position of the
// option we have to move.
if( $option->id == $o->id ) {
// Will be first element?
if( $index == 1) {
// Set the sort to current first element sort - 1
$option->sort = $options[0]->sort-1;
} else if( $index > 1) {
// Get the previous and the pre-previous items from the options
$pre = $options[$index-1]->sort;
$prepre = $options[$index-2]->sort;
$diff = ($pre - $prepre) / 2;
$option->sort = $prepre + $diff;
}
break;
}
}
$option->save();
Session::flash('message', __(':option moved up.', [ 'option' => $option->name ]));
Session::flash('message-type', 'success');
return redirect()->back();
}
public function down($id, $attributeId) {
$options = Attribute::findOrFail($attributeId)->options;
$option = Option::findOrFail($id);
foreach ($options as $index => $o) {
// Search for the current position of the
// option we have to move.
if( $option->id == $o->id ) {
// Will be last element?
if( $index == count($options)-2 ) {
// Set the sort to current last element sort + 1
$option->sort = $options[count($options)-1]->sort+1;
} else if( $index < count($options)-2) { // ???
// Get the previous and the pre-previous items from the options
$next = $options[$index+1]->sort;
$nextnext = $options[$index+2]->sort;
$diff = ($nextnext - $next) / 2;
$option->sort = $next + $diff;
}
break;
}
}
$option->save();
Session::flash('message', __(':option moved down.', [ 'option' => $option->name ]));
Session::flash('message-type', 'success');
return redirect()->back();
}
}