通过 Eager Loading 从 Eloquent 获取 RAW SQL 查询

Posted

技术标签:

【中文标题】通过 Eager Loading 从 Eloquent 获取 RAW SQL 查询【英文标题】:Get RAW SQL Query from Eloquent with Eager Loading 【发布时间】:2014-08-14 00:37:02 【问题描述】:

我有以下代码:

$books = Book::with(array('score' => function($query) use ($id)
            
               $query->where('media_type_id','=',$id)->orderBy('sorting_score','ASC');
            ))->get();

我有一张有书的桌子和一张有 media_score 的桌子 - 我有一个 belongsTo 关系。

当我执行 toSQL();它只返回我 select * from books ,而不是一个急切的加载等效项。

我需要急切加载等效项,因为我希望使用缓存系统(没有记忆功能),所以我想使用原始查询作为键。

转储查询日志不是一个选项,因为它发生在查询运行之后。

【问题讨论】:

查询生成器有一个函数getEagerLoads(),您可以在这里使用。 当我使用 getEagerLoads 而不是 get() - 我得到一个空白 @WereWolf-TheAlpha 如前所述,查询是为了制作一个哈希键,因此无法通过查询日志进行转储。 【参考方案1】:

试试这个plugin by barryvdh。它真的会帮助你调试你的 laravel 应用程序。它包括几个收藏家

    QueryCollector:显示所有查询,包括绑定 + 计时。 RouteCollector:显示有关当前路线的信息。 ViewCollector:显示当前加载的视图。 (可选:显示共享数据) EventsCollector:显示所有事件。

等等

编码愉快;

【讨论】:

【参考方案2】:

试试

DB::enableQueryLog();
  Book::with(array('score' => function($query) use ($id)
            
               $query->where('media_type_id','=',$id)->orderBy('sorting_score','ASC');
            ))->get();

$query_dump = DB::getQueryLog();

并打印$query_dump

【讨论】:

以上是关于通过 Eager Loading 从 Eloquent 获取 RAW SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章

ruby 包括,预加载,eager_loading

Laravel - Eager Loading BelongsToMany 关系

Laravel Eager Loading - 仅加载特定列

EF Core Eager Loading 嵌套集合

Laravel:Eloquent Eager Loading 关系的选择

Laravel Eager Loading 和动态绑定模型关系