0

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

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

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

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` = ?

如您所见,它们有很大的不同。为什么是这样?我正在尝试清除关系的查询缓存,为此我需要能够获取正在使用的实际查询,那么我该怎么做呢?

4

2 回答 2

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()
    );
于 2016-02-18T14:28:13.693 回答
0

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

拉拉维尔 4

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

拉拉维尔 5

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

这样您就不必在需要时编写特定的代码定位查询,只需单击底部的便捷栏即可查看它执行了哪些查询。

它事件具有“堆叠查询”,它允许您查看作为请求期间触发的事件的结果而执行的查询。

于 2016-02-18T14:46:03.543 回答