Laravel belongsToMany VS创建中间表模型

问题描述:

我belongsToMany关系在我的项目:Laravel belongsToMany VS创建中间表模型

public function products() { return $this->belongsToMany(Product::class,'order_products','order_id','product_id') ->withPivot('amount') ->withTimestamps(); }

因此我没有为中间表order_products任何模型。在这一点上,一切都很好,但我对这种关系有疑问。

  1. 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表的模型吗? (请注意,我有多个这样的查询)。

  2. 我应该使用查询生成器来获得第一个问题的结果,还是应该使用集合方法来获取此结果(如sum(),each()方法..)以实现性能。

  3. 一般来说,哪一个是高性能的:尝试使用sql查询来获得精致的结果或获得结果,然后使用php/laravel进行优化?

系统:laravel 5.4/7.1的PHP/MySQL的5.7

对不起我的英语不好。谢谢你们。

让我们来分析一下使用Laravel查询数据库时发生的情况。

  1. 使用Eloquent /数据库查询生成器来生成SQL。
  2. 将生成的SQL发送到数据库并执行。
  3. 从数据库中获取结果数据。
  4. 从数据中提取水合物Eloquent模型实例(如果使用Eloquent)或纯PHP对象(如果使用查询生成器)。

对于大多数情况下,第二步是瓶颈,您应该检查生成的SQL以查看是否可以改进它。

对于您的问题:

  1. 剂量它会导致性能问题?那么我应该使用order_products表的模型吗?

    性能取决于您的数据库和生成的SQL。为order_products使用模型可能有助于简化代码,但它对性能没有直接影响。

  2. 我应该使用查询生成器来获得第一个问题的结果,还是应该使用集合方法来获取此结果(如sum(),each()方法..)以实现性能。

    如果您不能使用查询生成器来生成更高性能的SQL语句,那么就不需要切换。使用集合通常意味着您需要从数据库中获取数据到PHP内存,然后在PHP中计算结果,如果您有大型数据集进行查询,我相信它会变慢。

  3. 一般来说,哪一个是高性能的:尝试使用sql查询来获得精致的结果或获得结果并仅使用php/laravel进行优化?

    为了获得更好的性能,您应该关注SQL语句。一旦获得了高性能的SQL,您可以使用Eloquent/Query构建器或您觉得方便的方式构建它,或者您可以将sql传递给\ DB :: select()以获取结果。雄辩和数据库查询构建器在构建sql语句时具有性能成本,但与大多数情况下的SQL执行相比,这些成本可能会被忽略。

+0

谢谢你的回答。但第三个需要清晰。对于instane,让我们考虑一下这两个代码片段DB :: all() - > sortBy('price'); DB:排序依据( '价格', 'ASC') - >获得(); ,哪一个更具表现力?正如你所看到的,第一个获取所有数据,然后用laravel collection的方法进行分类。但第二个获得数据排序。看起来第二个在sql上做了更多的工作,第一个在php/laravel上做了更多的工作。那么应该选择哪一个? – iedmrc99

+1

如果数据库可以使用索引[优化按顺序的子句](https://dev.mysql.com/doc/refman/5.7/en/order-by-optimization.html),那么数据库排序的性能是更好。如果数据集非常大,您应该考虑PHP是否有足够的内存来处理这些数据。如果PHP和数据库都有足够的内存,可以参考[本答案](https://stackoverflow.com/a/3620992/2042600)。一般来说,数据库排序具有更好的性能。我认为你需要对数据进行测试才能得到确切的答案。 – yixiang