在我的项目中,我使用带有Eloquent
和Scout
驱动程序的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
中,我将这样写:
// 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
这样的网站,或者其他和我有类似情况的实时拍卖网站:你认为他们是如何解决的?
提前谢谢。
发布于 2019-01-30 00:26:55
假设您有一个跟踪用户所拥有的项目的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);
您可以即时计算价格并为其添加别名。最后,您可以对其应用havingRaw
子句,该子句将检查价格是否在所需的范围内。这是一个实际工作的example。
也许有更好的方法可以做到这一点。我也很好奇地想知道:)
https://stackoverflow.com/questions/54424548
复制相似问题