如何在Laravel中使用附加属性进行排序

如何在Laravel中使用附加属性进行排序,laravel,eloquent,laravel-4,Laravel,Eloquent,Laravel 4,我根据下面的代码在Laravel模型中创建了一个appends属性 protected $appends = array('total'=>''); 我设置了返回值 public function getTotalAttribute(){ return ProductPart::where('product_id',$this->id)->count(); } 然后我想使用total属性对数据库中的记录进行排序 我尝试使用Pro

我根据下面的代码在Laravel模型中创建了一个appends属性

    protected $appends = array('total'=>'');
我设置了返回值

    public function getTotalAttribute(){
           return ProductPart::where('product_id',$this->id)->count();
    }
然后我想使用
total
属性对数据库中的记录进行排序

我尝试使用
Product::orderBy('total','desc')->get()
,但没有成功


有人对此有什么建议吗?

orderBy采用的是实际的数据库字段,而不是附加的字段

试试这个

$products = Product::all();
$products = $products->sortBy(function($product){
    return $product->total;
});

如果使用属性,这些属性并不总是立即可用(例如,对于新创建的模型)

作为对Ayobami Opeyemi答案的扩展,如果您通过直接调用属性的函数强制属性求值,您应该能够使用集合的sortBy:

$products = Product::all();
$products = $products->sortBy(function($product){
    return $product->getTotalAttribute();
});

您可以使用集合中的方法

$products = Product::all();
$products = $products->sortBy('total');

sortBy
用于ASC

$collection->sortBy('field');
$collection->sortByDesc('field');
使用
sortByDesc
进行DESC

$collection->sortBy('field');
$collection->sortByDesc('field');

如前所述,使用
sortBy()
回调的建议解决方案不适用于分页。
以下是可接受解决方案的替代方案:

orderByRaw() 如果可以从查询中的字段计算附加属性,则可以改为使用
orderByRaw()
,如下所示:

//例如,预订百分比
$query->orderByRaw('bookings\u count/total\u count');
请在此处查看更高级的示例:

谢谢,这太棒了,我试着用
return-$product->total
来扭转结果,它也很管用。它似乎管用,而且投票率也很高,但试了几次之后,它似乎真的不管用了。一旦拥有了集合,sortBy似乎对闭包或通过append属性对集合进行排序都没有效果(append属性确实出现在集合中的每个对象中)。对于忽略附加值的集合来说,这似乎是一个问题,因为附加值最终位于与“真实”属性不同的数组中。无法删除我的upvote,因为我需要编辑答案,但除了通过php排序外,无法提供任何见解。您找到解决此问题的方法了吗@Redsash尝试使用laravel自定义分页代码,但答案并不是特别有用。请简要说明此代码是如何解决问题的。如果使用
all()
,此方法有效,但如果使用分页,则会中断。@ceejayoz问题没有指定对返回的记录进行分页。实际上,您不能为集合分页。下面的要点有一个实现。