首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >按在移动中计算的值对元素进行排序(不存储)

按在移动中计算的值对元素进行排序(不存储)
EN

Stack Overflow用户
提问于 2019-01-29 23:36:26
回答 1查看 47关注 0票数 1

在我的项目中,我使用带有EloquentScout驱动程序的Laravel 5.5来构建一种搜索引擎应用编程接口端点。

在我的场景中,我有一个具有price_factor属性的SQL表items。该表也存储在Elasticsearch索引中。

有了这个值和与该项目相关的用户数量,我就可以计算出该对象的正确价格。

一个简单的例子是带有id: 1的项具有price_factor: 2,并且它与5 users相关。当然,这件商品的正确价格是2 * 5 = 10

现在,我必须查询所有结果并使用where conditions,按计算属性对它们进行排序,然后返回分页的结果。

例如:获取价格在5到10之间的所有项目,按price排序,并按每页10个元素进行分页。

Eloquent中,我将这样写:

代码语言:javascript
运行
复制
// Set filters to be applied
$filters = [
    ['price', '>', 5],
    ['price', '<', 10],
];
// Sort by "update_at", or "price"
$sort = "price";
// Order by "ASC" mode
$order = "ASC";
// Number of rows per page
$rows = 10;

// Get items
$result = Item::orderBy(
    $sort,
    $order
// Get related user with item record, where has...
)->with(['users'])->whereHas(
    // Take users related models
    'users',
    // Take the model related ("user") and use filters
    function($relation_model) use ($filters) {
        // Apply where condition with filters
        $relation_model->where($filters);
    }
// Paginate for the numbers of row requested
)->paginate($rows);

如果price不是表items的属性,该如何操作

我是否应该将价格存储在表中,并在添加的每个新用户关系中更新它?(或所有已删除的关系)。这是正确的方法吗?

我在考虑像eBay这样的网站,或者其他和我有类似情况的实时拍卖网站:你认为他们是如何解决的?

提前谢谢。

EN

回答 1

Stack Overflow用户

发布于 2019-01-30 00:26:55

假设您有一个跟踪用户所拥有的项目的user_items表,我认为这样做可能会起作用:

代码语言:javascript
运行
复制
$result = Item::selectRaw('items.*, price_factor * (SELECT COUNT(id) FROM user_items WHERE user_items.item_id = items.id) AS price')
    ->with(['users'])
    ->havingRaw('price > ? AND price < ?', [5, 10])
    ->orderBy('price', 'asc')
    ->paginate($rows);

您可以即时计算价格并为其添加别名。最后,您可以对其应用havingRaw子句,该子句将检查价格是否在所需的范围内。这是一个实际工作的example

也许有更好的方法可以做到这一点。我也很好奇地想知道:)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54424548

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档