我belongsToMany关系在我的项目:Laravel belongsToMany VS创建中间表模型
public function products() { return $this->belongsToMany(Product::class,'order_products','order_id','product_id') ->withPivot('amount') ->withTimestamps(); }
因此我没有为中间表order_products任何模型。在这一点上,一切都很好,但我对这种关系有疑问。
belongsToMany关系使我写这样的查询:
$cart=Auth::user()->orders() ->where('status', 0) ->firstOrFail() ->products() ->newPivotStatement() ->join('products', 'order_products.product_id', '=', 'products.id') ->select(DB::raw('products.*,(products.price * order_products.amount) as newPrice'), 'order_products.amount') ->get();
不会造成性能问题?那么我应该使用order_products表的模型吗? (请注意,我有多个这样的查询)。我应该使用查询生成器来获得第一个问题的结果,还是应该使用集合方法来获取此结果(如sum(),each()方法..)以实现性能。
- 一般来说,哪一个是高性能的:尝试使用sql查询来获得精致的结果或获得结果,然后使用php/laravel进行优化?
系统:laravel 5.4/7.1的PHP/MySQL的5.7
对不起我的英语不好。谢谢你们。
谢谢你的回答。但第三个需要清晰。对于instane,让我们考虑一下这两个代码片段DB :: all() - > sortBy('price'); DB:排序依据( '价格', 'ASC') - >获得(); ,哪一个更具表现力?正如你所看到的,第一个获取所有数据,然后用laravel collection的方法进行分类。但第二个获得数据排序。看起来第二个在sql上做了更多的工作,第一个在php/laravel上做了更多的工作。那么应该选择哪一个? – iedmrc99
如果数据库可以使用索引[优化按顺序的子句](https://dev.mysql.com/doc/refman/5.7/en/order-by-optimization.html),那么数据库排序的性能是更好。如果数据集非常大,您应该考虑PHP是否有足够的内存来处理这些数据。如果PHP和数据库都有足够的内存,可以参考[本答案](https://stackoverflow.com/a/3620992/2042600)。一般来说,数据库排序具有更好的性能。我认为你需要对数据进行测试才能得到确切的答案。 – yixiang