按移动时计算的值对元素排序(不存储)

时间:2019-01-29 15:36:26

标签: php mysql laravel elasticsearch eloquent

在我的项目中,我使用Laravel 5.5EloquentScout驱动程序来构建某种搜索引擎API端点。

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

有了这个值和与该物品相关的用户数量,我可以计算出该物体的正确价格。

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

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

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

Eloquent中,我将写:

// 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这样的网站或其他实时拍卖,它们与我的情况类似:您认为他们的解决方式如何?

谢谢。

1 个答案:

答案 0 :(得分:1)

假设您有一个myFunction.sh表来跟踪用户拥有的商品,我认为类似的方法可能有用:

user_items

您可以即时计算价格并对其进行别名。最后,您可以对其应用$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); 子句,该子句将检查价格是否在所需的价格范围之间。这是实际的工作example

可能会有更好的方法来执行此操作。我也很想知道:)