首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Laravel belongsToMany与创建中间表模型

问Laravel belongsToMany与创建中间表模型
EN

Stack Overflow用户
提问于 2017-07-17 00:47:52
回答 1查看 669关注 0票数 1

我的项目中有belongsToMany关系:

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 / php 7.1 / mysql 5.7

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-17 06:24:31

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

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

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

对于你的问题:

  1. 它会导致性能问题吗?那么,我应该为order_products表使用一个模型吗? 性能取决于数据库和生成的SQL。为order_products使用一个模型可能有助于简化您的代码,但它不会直接影响性能。
  2. 应该像第一个问题那样使用查询生成器来获得结果,还是应该使用集合方法来获得这个结果(比如sum(),each()方法.)以达到性能。 如果您不能使用查询生成器来生成一个性能更好的SQL语句,那么就不需要切换。使用集合通常意味着您需要从数据库中获取数据到PHP内存,然后在PHP中计算结果,我相信如果您有一个大的数据集要查询,它会慢一些。
  3. 一般来说,哪一种是高性能的:尝试使用sql查询获得精炼的结果,还是获得结果,然后只使用php/laravel进行细化? 为了获得更好的性能,您应该关注SQL语句。一旦获得了高性能的SQL,就可以使用雄辩的/查询构建器或任何感觉方便的工具来构建它,或者可以将sql传递给\DB::select()以获得结果。雄辩和数据库查询生成器在构建sql语句方面有性能成本,但与大多数情况下的SQL执行相比,成本可以忽略不计。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45134607

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档