【发布时间】: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_at是starsdesc 的空订单)
我明白这一点,星号在数据库中不存在,但我怎样才能使它工作?
【问题讨论】:
-
显示数据库结构和模型
-
我认为你不应该
orderBy和$sort因为你说 `stars' 在数据库中不存在。 -
星级是如何计算的?对附加值进行排序的缺点是,您必须首先从数据库中获取 all 结果,然后附加计算的值,最后您将能够按照您想要的方式对其进行排序对其进行排序。对于大型结果集,这种方法必然会变得缓慢。此外,您将无法从数据库正确分页,您需要基于集合切片创建自定义分页。