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。在这一点上,一切都很好,但我对这个关系有疑问。
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 的模型吗? (请注意,我有不止一个这样的查询)。
我应该像第一个问题一样使用查询构建器来获取结果,还是应该使用集合方法来获取此结果(如 sum()、each() 方法..)以实现性能.
- 一般来说,哪一个是高性能的:尝试使用 sql 查询获得精炼结果或获得结果并仅使用 php/laravel 精炼?
系统:laravel 5.4 / php 7.1 / mysql 5.7
抱歉我的英语不好。谢谢大家
让我们分解一下使用 Laravel 查询数据库时发生的情况。
- 使用 Eloquent/Database 查询生成器生成 SQL。
- 将生成的SQL发送到数据库并执行。
- 从数据库中获取结果数据。
- 从数据中混合 Eloquent 模型实例(如果您使用 Eloquent)或纯 PHP 对象(如果您使用查询构建器)。
对于大多数情况,第 2 步是瓶颈,您应该检查生成的 SQL 以查看是否可以改进它。
您的问题:
会不会导致性能问题?那么我应该使用 order_products table 的模型吗?
性能取决于您的数据库和生成的 SQL。使用模型 order_products 可能有助于简化您的代码,但对性能没有直接影响。
我应该像第一个问题那样使用查询构建器来获取结果,还是应该使用集合方法来获取此结果(如 sum()、each() 方法..)以实现性能.
如果您不能使用查询生成器生成性能更高的 SQL 语句,则无需切换。通常使用集合意味着你需要从数据库中获取数据到 PHP 内存,然后将结果计算到 PHP,我相信如果你有一个大数据集要查询,它会更慢。
一般来说,哪个是高性能:尝试使用 sql 查询获得精炼结果或获得结果并仅使用 php/laravel 精炼?
为了获得更好的性能,您应该关注 SQL 语句。一旦获得高性能 SQL,您可以使用 Eloquent/Query 构建器或任何您觉得方便的方式构建它,或者您可以将 sql 传递给 \DB::select () 得到结果。 Eloquent 和数据库查询构建器在构建 sql 语句时有性能成本,但在大多数情况下与 SQL 执行相比,成本可以忽略不计。
我的项目中有 belongsToMany 关系:
public function products()
{
return $this->belongsToMany(Product::class,'order_products','order_id','product_id')
->withPivot('amount')
->withTimestamps();
}
因此我没有任何中间模型 table 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 table 的模型吗? (请注意,我有不止一个这样的查询)。我应该像第一个问题一样使用查询构建器来获取结果,还是应该使用集合方法来获取此结果(如 sum()、each() 方法..)以实现性能.
- 一般来说,哪一个是高性能的:尝试使用 sql 查询获得精炼结果或获得结果并仅使用 php/laravel 精炼?
系统:laravel 5.4 / php 7.1 / mysql 5.7
抱歉我的英语不好。谢谢大家
让我们分解一下使用 Laravel 查询数据库时发生的情况。
- 使用 Eloquent/Database 查询生成器生成 SQL。
- 将生成的SQL发送到数据库并执行。
- 从数据库中获取结果数据。
- 从数据中混合 Eloquent 模型实例(如果您使用 Eloquent)或纯 PHP 对象(如果您使用查询构建器)。
对于大多数情况,第 2 步是瓶颈,您应该检查生成的 SQL 以查看是否可以改进它。
您的问题:
会不会导致性能问题?那么我应该使用 order_products table 的模型吗?
性能取决于您的数据库和生成的 SQL。使用模型 order_products 可能有助于简化您的代码,但对性能没有直接影响。
我应该像第一个问题那样使用查询构建器来获取结果,还是应该使用集合方法来获取此结果(如 sum()、each() 方法..)以实现性能.
如果您不能使用查询生成器生成性能更高的 SQL 语句,则无需切换。通常使用集合意味着你需要从数据库中获取数据到 PHP 内存,然后将结果计算到 PHP,我相信如果你有一个大数据集要查询,它会更慢。
一般来说,哪个是高性能:尝试使用 sql 查询获得精炼结果或获得结果并仅使用 php/laravel 精炼?
为了获得更好的性能,您应该关注 SQL 语句。一旦获得高性能 SQL,您可以使用 Eloquent/Query 构建器或任何您觉得方便的方式构建它,或者您可以将 sql 传递给 \DB::select () 得到结果。 Eloquent 和数据库查询构建器在构建 sql 语句时有性能成本,但在大多数情况下与 SQL 执行相比,成本可以忽略不计。