如何获取用于检索关系的实际查询?

时间:2016-02-18 13:55:56

标签: laravel eloquent laravel-4.2

如果我使用toSql()转储查询的sql,我得到这个:

select * from `permissions` inner join `vendor_permissions` on `permissions`.`id` = `vendor_permissions`.`permission_id` where `vendor_permissions`.`vendor_id` = ?

但是发送到我的数据库的ACTUAL查询是这样的:

select `permissions`.*, `vendor_permissions`.`vendor_id` as `pivot_vendor_id`, `vendor_permissions`.`permission_id` as `pivot_permission_id` from `permissions` inner join `vendor_permissions` on `permissions`.`id` = `vendor_permissions`.`permission_id` where `vendor_permissions`.`vendor_id` = ?

如你所见,它们有点不同。为什么是这样?我试图清除关系的查询缓存,为此我需要能够获得正在使用的实际查询,所以我该怎么做?

2 个答案:

答案 0 :(得分:0)

要重建实际正在运行的查询,您需要添加到选择枢轴列。这个功能可以做到:

function buildRelationQuery($relation)
{
    $wheres = $relation->newPivotStatementForId(null)->wheres;
    $select = [$relation->getRelated()->getTable().'.*'];
    foreach($wheres as $w) {
        $select[] = $relation->getTable().'.'.$w['column'].' as pivot_'.$w['column'];
    }
    $relation->getQuery()->addSelect($select);
    return $relation;
}

因此,要清除关系属性的缓存,可以执行以下操作:

Cache::forget(
    buildRelationQuery($model->relationattribute())
        ->getQuery()
        ->getQuery()
        ->getCacheKey()
    );

答案 1 :(得分:0)

查看正在运行哪些查询的最简单方法是使用barryvdh的Laravel Debugbar:

Laravel 4

https://github.com/barryvdh/laravel-debugbar/tree/1.8

Laravel 5

https://github.com/barryvdh/laravel-debugbar

通过这种方式,您无需在需要时编写特定的代码定位代码,只需单击底部的便捷栏即可查看已执行的查询。

该事件具有“堆叠查询”,允许您查看在请求期间触发的事件执行的查询。