Laravel belongsToMany 与创建中间 table 模型

Laravel belongsToMany vs creating intermediate table model

我的项目中有 belongsToMany 关系:

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

因此我没有任何中间模型 table 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 table 的模型吗? (请注意,我有不止一个这样的查询)。

  2. 我应该像第一个问题一样使用查询构建器来获取结果,还是应该使用集合方法来获取此结果(如 sum()、each() 方法..)以实现性能.

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

系统:laravel 5.4 / php 7.1 / mysql 5.7

抱歉我的英语不好。谢谢大家

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

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

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

您的问题:

  1. 会不会导致性能问题?那么我应该使用 order_products table 的模型吗?

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

  2. 我应该像第一个问题那样使用查询构建器来获取结果,还是应该使用集合方法来获取此结果(如 sum()、each() 方法..)以实现性能.

    如果您不能使用查询生成器生成性能更高的 SQL 语句,则无需切换。通常使用集合意味着你需要从数据库中获取数据到 PHP 内存,然后将结果计算到 PHP,我相信如果你有一个大数据集要查询,它会更慢。

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

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