我想使用查询函数,因为我在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分页,但是在我工作的项目中有这么多的表,我想保持相同的标准。有人可以帮助我吗?
1条答案
按热度按时间ep6jt1vc1#
您对
query()
的功能有一个误解,简单地说,它没有任何不同,而且它不会帮助您优化查询。型号::选择(参数)
当你执行
Model::select('col1', 'col2')
时,会发生这样的情况:1.没有
Model::select
公共静态函数,因此改为调用__callStatic(method: 'select', parameters: ['col1', 'col2'])
。__callStatic
在Model
中所做的一切就是试图调用一个传入parameters
的公共函数method
。1.没有
Model::select
公共函数,因此改为调用__call(method: 'select', parameters: ['col1', 'col2'])
。__call
所做的全部工作就是将调用转发给公共函数Model::newQuery
返回的对象。总之,当您执行
Model::select(args)
时,它与执行(new Model)->newQuery()->select(args)
是相同的。模型::查询()-〉选择(参数)
这是Model::query公共静态函数的源代码。
如你所见,这是一样的。
使用
query()
的唯一“优化”是缩短调用堆栈。Model::select()
__callStatic
__call
forwardCallTo
newQuery
Model::query()->select()
newQuery
newQuery
和select
之间仍然有一些额外的步骤发生,但它们是相同的。至于可能的优化:
1.在
audits
的user_id
列上创建索引1.分页
1.延迟加载结果(游标,延迟)
1.通过 AJAX 加载数据