【问题标题】:Laravel eloquent orderBy a number hundreds first and not lastLaravel 雄辩的顺序由数百个第一个而不是最后一个
【发布时间】:2020-03-20 14:17:08
【问题描述】:

我遇到了一个小问题(我希望),希望你们中的一个人能够帮助我:)

在我的数据库中获得以下值:56、63、75、80、90、100、132

我得到了这个代码:

MotorSize::orderBy('framesize', 'asc')
            ->get();

然后在刀片中:

@foreach($motor_sizes as $motor_size)
    {{ $motor_size->name }}
@endforeach

我希望输出为:56、63、75、80、90、100、132

但输出是:100、132、56、63、75、80、90

为什么会这样?如何解决?我猜它与值的起始整数有关。

与值相关的数据库表:

$table->string('framesize');

也许是因为它不是整数?有什么解决办法吗?

【问题讨论】:

  • 因为结果是按字母顺序排列的,而不是按数字排列的。您订购的字段类型为string
  • 是的,orderByRaw("CAST(framesize as UNSIGNED) ASC") 成功了 :)
  • 为什么存储为字符串呢?您正在进行查询以进行额外的处理。实际答案是只更改 DB 列的数据类型。
  • @vivek_23 这也是一个好建议。 Kenneth,您应该拥有它,这样您就不会不必要地使与该模型有关的其他雄辩的查询复杂化。

标签: php laravel eloquent


【解决方案1】:

您可以使用原始查询来获得所需的结果。

$query = "CAST(framesize AS INTEGER) ASC";
DB::table('motor_size')->orderByRaw($query)->get();

但是,更好的方法应该是修改列的数据类型。这样做会:

  1. 减小表的大小。
  2. 优化包含该列的索引。
  3. 其他 eloquent 查询也需要上述原始查询,不建议这样做。

为此创建一个新的迁移:

php artisan make:migration AlterFrameSizeInMotorSizeTable

添加以下作为 up 函数定义:

public function up()
{
    Schema::table('motor_size', function (Blueprint $table) {
        $table->integer('framesize')->change();
    });
}

然后使用以下命令运行迁移:

php artisan migrate

【讨论】:

  • 感谢您更改列数据类型的建议。我将改为这样做 - 似乎是一个更好的长期解决方案:)
【解决方案2】:
->orderByRaw('CONVERT(framesize, UNSIGNED) ASC');

->orderByRaw('CAST(framesize as UNSIGNED) ASC');

【讨论】:

    猜你喜欢
    • 2013-09-08
    • 2011-09-25
    • 1970-01-01
    • 2021-05-07
    • 2021-06-23
    • 2018-05-17
    • 2014-11-07
    • 2020-10-26
    • 2021-12-31
    相关资源
    最近更新 更多