【问题标题】:orderBy in Laravel + jquery datatablesLaravel + jquery 数据表中的 orderBy
【发布时间】:2016-11-19 01:33:28
【问题描述】:

在我的数据库中,这就是我所拥有的

我尝试查询所有内容并按价格订购

$service_plans = DB::table('service_plans') ->orderBy('price', 'asc') ->get();

我一直在得到

我是否错过了什么或做了什么我不应该在这里做的事情?

有什么提示吗?

附:请记住,我正在使用 jQuery DataTables

【问题讨论】:

  • 您的数据库中price 列的数据类型是什么?另外,您不是偶然使用 DataTables 进行显示的吗?
  • 在查询后立即使用dd($service_plans) 并查看输出。如果它在那里排序(我期望它是这样),你知道 Laravel 做的事情是正确的,它是其他的事情。
  • 订单 by 正在工作....但您的数据似乎被视为字符串而不是 int...
  • 是的。我正在使用数据表。
  • 如果您使用的是 DataTables,它将在第一列上自动排序,这将使它看起来像您的 orderBy 不起作用。

标签: php laravel laravel-5 datatables


【解决方案1】:

由于您使用的是 Datatables jQuery 插件,请删除控制器查询中的 orderBy

相反,通过数据表进行排序(默认情况下会这样做):

$('#datatable').DataTable({
    "order": [[ 2, "asc" ]] // Order on init. # is the column, starting at 0
});

还有一个不错的 Laravel 小包,用于设置数据的数据表。检查它,看看它是否有用:https://github.com/yajra/laravel-datatables

【讨论】:

  • 根据我的情况,我想这是最干净的方式。
  • 如果您放弃数据表或使用其他解决方案,我仍然可能会在服务器端进行排序。 ;)
【解决方案2】:

您仍然可以获得该数据,因为数据表也会对您的数据进行排序,因此您的 orderBy 查询不起作用。只需将参数设置为 datatable ordering: false 即可。

$('#datatable').DataTable({
    ordering: false, //disable ordering datatable
});

因此,您可以按您想要的任何字段对数据进行排序,尽管您不想在表格中显示它们。

【讨论】:

    【解决方案3】:

    您可以将$casts 属性添加到您的ServicePlan 模型。无论数据库数据类型如何,这都会将该列视为隐式数据类型。

    class ServicePlan extends Model
    {
        /**
         * The attributes that should be casted to native types.
         *
         * @var array
         */
        protected $casts = [
            'price' => 'integer',
        ];
    }
    

    https://laravel.com/docs/5.2/eloquent-mutators#attribute-casting

    【讨论】:

    • 问题不在于价格字段的数据类型。 jQuery DataTables 默认按第一列对表格进行排序。更多解释见answer by Mike Barwick
    • 有道理。所以这不是 laravel 问题 - 也许应该删除 laravel 标签?
    • OP 使用 Laravel,所以标签 laravel 是有意义的。 Mike Barwick 为 Laravel 推荐了优秀的 yajra/laravel-datatables 包以使用 jQuery DataTables。
    • @Gyrocode.com 当然 OP 使用 Laravel,但对于使用 CodeIgniter、Rails 或 Python 的人来说,这个问题肯定会出现。这个问题的标题和标签方式,我们没有帮助那些开发者。
    【解决方案4】:

    价格字段的类型是字符串,因此将其更改为十进制,逗号后有 2 个数字。

    在mysql控制台中运行:

    ALTER TABLE service_plans MODIFY price DECIMAL(10,2);
    

    !!!在生产中对表进行修改时,请确保在调用 ALTER TABLE 之前您已经复制了表:

    CREATE TABLE service_plans_bak AS SELECT * FROM service_plans;
    

    【讨论】:

    • 他正在使用databtables jQuery插件。无论给定对象如何(基于数据表的第一列),它都会自动对数据进行排序。
    • 问题不在于价格字段的数据类型。 jQuery DataTables 默认按第一列对表格进行排序。更多解释见answer by Mike Barwick
    • @Gyrocode.com 看看标题:“Laravel 中的 orderBy”,所以作者告诉他排序有问题,并且作者没有定义他有 jQuery-Datatables(只有标签:datatables ),但另一个问题是:如果客户说“我不需要 200 条记录在一页中”,那么他会回到服务器端必须返回已经排序和分页的数据的想法。
    • 我同意这个问题含糊不清,但有datatables 标签,并且 OP 确认他在 cmets 中使用 jQuery DataTables。使用 jQuery DataTables 排序是在客户端或服务器端完成的,但不是以 OP 的方式。
    • 我相信这是正确的答案,或者无论如何都应该这样做。假设数据表在某个时候停止使用,这个问题将再次出现。没有任何理由不赞成这个答案。
    猜你喜欢
    • 2020-07-08
    • 2017-04-02
    • 2018-09-25
    • 1970-01-01
    • 1970-01-01
    • 2021-05-18
    • 2019-03-21
    • 1970-01-01
    • 2021-01-27
    相关资源
    最近更新 更多