如何使用查询功能来修复性能缓慢的laravel数据表?

ijxebb2r  于 2023-02-10  发布在  其他
关注(0)|答案(1)|浏览(114)

我想使用查询函数,因为我在laravel datatable中的性能很慢。我有这个选择:

$audits = \OwenIt\Auditing\Models\Audit::select(
            'audits.id',
            'audits.user_type',
            'audits.user_id',
            'audits.event',
            'audits.auditable_id',
            'audits.auditable_type',
            'audits.old_values',
            'audits.new_values',
            'audits.created_at',
            'users.login'
        )
        ->join('users','users.id','audits.user_id');

我试着这样使用查询函数:

$audits = \OwenIt\Auditing\Models\Audit::query()->select(
            'audits.id',
            'audits.user_type',
            'audits.user_id',
            'audits.event',
            'audits.auditable_id',
            'audits.auditable_type',
            'audits.old_values',
            'audits.new_values',
            'audits.created_at',
            'users.login'
        )
        ->join('users','users.id','audits.user_id');

但无法运行上面的代码。
我想使用Laravel分页,但是在我工作的项目中有这么多的表,我想保持相同的标准。有人可以帮助我吗?

ep6jt1vc

ep6jt1vc1#

您对query()的功能有一个误解,简单地说,它没有任何不同,而且它不会帮助您优化查询。

型号::选择(参数)

当你执行Model::select('col1', 'col2')时,会发生这样的情况:
1.没有Model::select公共静态函数,因此改为调用__callStatic(method: 'select', parameters: ['col1', 'col2'])

  1. __callStaticModel中所做的一切就是试图调用一个传入parameters的公共函数method
# Illuminate\Database\Eloquent\Model
public static function __callStatic($method, $parameters)
{
    return (new static)->$method(...$parameters);
}

1.没有Model::select公共函数,因此改为调用__call(method: 'select', parameters: ['col1', 'col2'])

  1. __call所做的全部工作就是将调用转发给公共函数Model::newQuery返回的对象。
# Illuminate\Database\Eloquent\Model
public function __call($method, $parameters)
{
    if (in_array($method, ['increment', 'decrement'])) {
        return $this->$method(...$parameters);
    }

    if ($resolver = ($this->relationResolver(static::class, $method))) {
        return $resolver($this);
    }

    return $this->forwardCallTo($this->newQuery(), $method, $parameters);
}

总之,当您执行Model::select(args)时,它与执行(new Model)->newQuery()->select(args)是相同的。

模型::查询()-〉选择(参数)

这是Model::query公共静态函数的源代码。

public static function query()
{
     return (new static)->newQuery();
}

如你所见,这是一样的。
使用query()的唯一“优化”是缩短调用堆栈。
Model::select()

  • 呼叫__callStatic
  • 呼叫__call
  • 呼叫forwardCallTo
  • 呼叫newQuery

Model::query()->select()

  • 呼叫newQuery

newQueryselect之间仍然有一些额外的步骤发生,但它们是相同的。
至于可能的优化:
1.在auditsuser_id列上创建索引
1.分页
1.延迟加载结果(游标,延迟)

  • https://laravel.com/docs/9.x/eloquent#cursors
  • https://laravel.com/docs/9.x/eloquent#chunking-using-lazy-collections

1.通过 AJAX 加载数据

相关问题