Laravel - 如何排序,订购附加字段

时间:2017-01-11 09:44:50

标签: php laravel laravel-5

我正在创建一个搜索特定类型书籍的功能。一切都很好,除了排序,由星星排序'附在模型中。

功能:

 $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未知专栏'明星'在' order子句' (SQL:   从books中选择*,其中genre_id = 1且club_id = 24和   booksdeleted_atstars desc)

的空订单

我理解这一点,星星在数据库中不存在,但是我如何才能使它工作?

1 个答案:

答案 0 :(得分: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