如何重构 Laravel Eloquent 查询
Posted
技术标签:
【中文标题】如何重构 Laravel Eloquent 查询【英文标题】:How to refactor Laravel Eloquent Query 【发布时间】:2021-12-26 11:33:20 【问题描述】:我有一个使用联接从 5 个表中检索数据的查询。虽然我得到了正确的结果,但速度很慢。
表格:
data_bundles 供应商 ussd_strings 产品用户 data_bundles_category我该如何重构它?
此外,该设置不使用模型。
$data_bundle_transaction = DB::table('data_bundles')
->select('*','data_bundles.phone_number as data_bundles_phone_number')
->join('vendors','vendors.vendor_id','=','data_bundles.vendor_id')
->join('ussd_strings','data_bundles.product_id','=','ussd_strings.product_id')
->join('products','data_bundles.product_id','=','products.product_id')
->join('users','users.user_id','=','data_bundles.user_id')
->leftJoin('data_bundle_category', 'data_bundle_category.product_id', '=', 'data_bundles.product_id')
->where('data_bundles.status',0)
->where('data_bundles.network','like', '%' . $request->network.'%')
->where('data_bundle_category.data_category', '=', $request->type)->first();
【问题讨论】:
你想做什么重构?请分享您想要实现的目标。 目前,查询需要很长时间才能完成。我需要一个能提高速度的。 请检查 where 子句中的列是否有索引。 data_bundles 表中的状态、网络和 data_category 等列。 这些列上没有索引 请为我们提供每个相关表的生成 SQL 和SHOW CREATE TABLE
。
【参考方案1】:
您可以尝试使用多条件连接,这样您将连接更少的数据并且查询会更快
$data_bundle_transaction = DB::table('data_bundles')
->select('*','data_bundles.phone_number as data_bundles_phone_number')
->join('vendors','vendors.vendor_id','=','data_bundles.vendor_id')
->join('ussd_strings','data_bundles.product_id','=','ussd_strings.product_id')
->join('products','data_bundles.product_id','=','products.product_id')
->join('users','users.user_id','=','data_bundles.user_id')
->leftJoin('data_bundle_category', function() use ($request)
$join->on('data_bundle_category.product_id', '=', 'data_bundles.product_id');
$join->on('data_bundle_category.data_category', '=', $request->type);
)
->where('data_bundles.status',0)
->where('data_bundles.network','like', '%' . $request->network.'%')
->first();
【讨论】:
以上是关于如何重构 Laravel Eloquent 查询的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Eloquent 在 Laravel 中开始查询?
如何查询 Laravel Eloquent 的 belongsTo 关系?