在我的项目中,我使用Laravel 5.5
和Eloquent
和Scout
驱动程序来构建某种搜索引擎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
这样的网站或其他实时拍卖,它们与我的情况类似:您认为他们的解决方式如何?
谢谢。
答案 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。
可能会有更好的方法来执行此操作。我也很想知道:)