gpt4 book ai didi

php - Laravel belongsToMany 与创建中间表模型

转载 作者:行者123 更新时间:2023-11-28 23:12:55 26 4
gpt4 key购买 nike

我的项目中有 belongsToMany 关系:

公共(public)函数产品()
{
返回 $this->belongsToMany(Product::class,'order_products','order_id','product_id')
->withPivot('数量')
->withTimestamps();
}

因此我没有任何中间表 order_products 的模型。此时,一切正常,但我对这种关系有疑问。

  1. belongsToMany 关系使我编写了这样的查询:

    $cart=Auth::user()->orders()
    ->哪里('状态',0)
    ->firstOrFail()
    ->产品()
    ->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/php 7.1/mysql 5.7

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

最佳答案

让我们分解一下使用 Laravel 查询数据库时会发生什么。

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

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

对于您的问题:

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

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

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

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

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

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

关于php - Laravel belongsToMany 与创建中间表模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45134607/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com