我在数据库中使用EAV模式。这意味着我拥有一个产品,该产品属于很多规格,并且这些规格属于很多规格值。
我需要按条件对我的产品进行分类。例如,我的产品具有“规格”组。像iPhone 6这样的产品具有“电话”组,而“电话”组具有诸如显示,RAM和存储之类的规格。所有这些规范都有一个位置列,例如RAM(POS 1),存储(POS 2),Display(Pos 3)。在每个规格中,很多值和每个值也具有位置列。
因此,当我拿到我所有的产品时,每个产品都与小组有联系。我使用雄辩的关系hasManyThrough来获取连接到该组的所有规范。
这就是我的收藏集的样子: https://pastebin.com/8TAM62wt
根据示例,我需要按规格值对位置进行排序,但值应按位置列规格表获取。我的英语不好,所以我再举一个例子。
此代码中 https://pastebin.com/QnC7Drq3
我需要按规格值对所有产品进行排序,其中规格表的标题为Display,因为它的位置是1。 因此,我按显示器对产品进行了排序,然后转到位置值较高的下一个规格。根据此示例,它将是Storage,原因是位置3。
我知道唯一的一种方法,即如何排序,当relatedSpecifications是一个数组(集合)时,它是有效的,但是当它是array的数组时,它是无效的。
$products = ModelProvidersProducts::has('relatedProduct')->where('quantity', '!=', 0)->get();
$products->sortBy(function($q){
return $q->relatedProduct->relatedSpecifications->position;
});
我希望我的英语足以描述我的问题。希望你们中的一些人能帮助我,或者至少显示正确的道路。
另外,我了解排序集合的方式比较慢,然后排序为orderBy,如果可以用orderBy而不是sortBy给出示例,也许会更好?
答案 0 :(得分:0)
您可以通过链式排序依据来实现
$products->sortBy(function($q){
return $q->relatedProduct->relatedSpecifications->position;
})->sortBy(function($q){
return $q->relatedProduct->relatedSpecifications->somethingelse;
});