【问题标题】:Laravel - How to sort, order appended fieldsLaravel - 如何对附加字段进行排序和排序
【发布时间】:2017-01-11 18:24:41
【问题描述】:

我正在创建一个功能来搜索特定类型的书籍。一切正常,除了排序,按模型中附加的“星”排序。

功能:

 $genre = Genre::find($genre_id);


    $phrase = $request->search;
    $sort = $request->sort;
    $order = $request['order'];


    if (!isset($sort) || !in_array($sort, ['title', 'stars', 'created_at', 'author_id']))
        $sort = 'title';

    if (!isset($order) || !in_array($order, ['DESC', 'ASC']))
        $order = 'DESC';


    $result['name'] = $genre->name;
    $result['results'] = Book::with('authors')->whereGenre_id($genre_id)->where('club_id', '=', $club_id)
        ->where(function ($query) use ($phrase, $club_id, $sort, $order, $user) {

            if (isset($phrase))
                $query->where('title', 'LIKE', '%' . $phrase . '%');
        })
        ->orderBy($sort, $order)
        ->get();

当我尝试按“星”排序时出现错误:

找不到列:1054 未知列“星号”在“订单子句”(SQL: 从books 中选择*,其中genre_id = 1 和club_id = 24 和 books.deleted_atstars desc 的空订单)

我明白这一点,星号在数据库中不存在,但我怎样才能使它工作?

【问题讨论】:

  • 显示数据库结构和模型
  • 我认为你不应该 orderBy$sort 因为你说 `stars' 在数据库中不存在。
  • 星级是如何计算的?对附加值进行排序的缺点是,您必须首先从数据库中获取 all 结果,然后附加计算的值,最后您将能够按照您想要的方式对其进行排序对其进行排序。对于大型结果集,这种方法必然会变得缓慢。此外,您将无法从数据库正确分页,您需要基于集合切片创建自定义分页。

标签: php laravel laravel-5


【解决方案1】:

这是最终的工作代码:

$res = Book::with('authors')
        ->where('genre_id', $genre_id)
        ->where('club_id', $club_id)
        ->where(function ($query) use ($phrase) {
            if (isset($phrase))
                $query->where('title', 'LIKE', '%' . $phrase . '%');
        })->get();

    if($order == 'ASC'){
        $res = $res->sortBy($sort);
    }else{
        $res = $res->sortByDesc($sort);
    }

    $result['results'] = $res->values()->all();

@mith 我将->all() 更改为->get(),得到的最终结果如下所示:

$result['results'] = $res->values()->all();

Laravel documentation - sortBy

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    相关资源
    最近更新 更多