laravel admin 教程-admin 怎样查库中的数据只查出一条where()排序最大的一条

使用Laravel的ORM&&Eloquent时,时常遇到的一个操作是取模型中的其中一些属性,对应的就是在数据库中取表的特定列。
如果使用DB门面写查询构造器,那只需要链式调用select()方法即可:
$users = DB::table('users')-&select('name', 'email as user_email')-&get();
使用Eloquent的话,有两种方式:
1. 使用select()
$users = User::select(['name'])-&get();
2. 直接将列名数组作为参数传入all()/get()/find()等方法中
1 $users = User::all(['name']);
2 $admin_users = User::where('role', 'admin')-&get(['id', 'name']);
3 $user = User::find($user_id, ['name']);
在关联查询中使用同理:
$posts = User::find($user_id)-&posts()-&select(['title'])-&get();
$posts = User::find($user_id)-&posts()-&get(['title', 'description']);
注意这里不能使用动态属性(-&posts)来调用关联关系,而需要使用关联关系方法(-&posts())。
阅读(...) 评论()Laravel框架数据库CURD操作、连贯操作总结
这篇文章主要介绍了Laravel框架数据库CURD操作、连贯操作、链式操作总结,本文包含大量数据库操作常用方法,需要的朋友可以参考下
一、Selects
检索表中的所有行
$users = DB::table('users')-&get();
foreach ($users as $user)
var_dump($user-&name);
从表检索单个行
$user = DB::table('users')-&where('name', 'John')-&first();
var_dump($user-&name);
检索单个列的行
$name = DB::table('users')-&where('name', 'John')-&pluck('name');
检索一个列值列表
$roles = DB::table('roles')-&lists('title');
该方法将返回一个数组标题的作用。你也可以指定一个自定义的键列返回的数组
$roles = DB::table('roles')-&lists('title', 'name');
指定一个Select子句
$users = DB::table('users')-&select('name', 'email')-&get();
 $users = DB::table('users')-&distinct()-&get();
 $users = DB::table('users')-&select('name as user_name')-&get();
Select子句添加到一个现有的查询$query = DB::table('users')-&select('name');
$users = $query-&addSelect('age')-&get();
$users = DB::table('users')-&where('votes', '&', 100)-&get();
$users = DB::table('users')-&where('votes', '&', 100)-&orWhere('name', 'John')-&get();
Where Between
$users = DB::table('users')-&whereBetween('votes', array(1, 100))-&get();
Where Not Between
$users = DB::table('users')-&whereNotBetween('votes', array(1, 100))-&get();
Where In With An Array
$users = DB::table('users')-&whereIn('id', array(1, 2, 3))-&get();
$users = DB::table('users')-&whereNotIn('id', array(1, 2, 3))-&get();
Using Where Null To Find Records With Unset Values
$users = DB::table('users')-&whereNull('updated_at')-&get();
Order By, Group By, And Having
$users = DB::table('users')-&orderBy('name', 'desc')-&groupBy('count')-&having('count', '&', 100)-&get();
Offset & Limit
$users = DB::table('users')-&skip(10)-&take(5)-&get();
查询构建器也可以用来编写连接语句。看看下面的例子:
Basic Join Statement
DB::table('users')
  -&join('contacts', 'users.id', '=', 'contacts.user_id')
  -&join('orders', 'users.id', '=', 'orders.user_id')
  -&select('users.id', 'contacts.phone', 'orders.price')
  -&get();
左连接语句
DB::table('users')
  -&leftJoin('posts', 'users.id', '=', 'posts.user_id')
  -&get();
  DB::table('users')
  -&join('contacts', function($join)
  $join-&on('users.id', '=', 'contacts.user_id')-&orOn(...);
  -&get();
  DB::table('users')
  -&join('contacts', function($join)
  $join-&on('users.id', '=', 'contacts.user_id')
  -&where('contacts.user_id', '&', 5);
  -&get();
  有时候,您可能需要创建更高级的where子句,如“存在”或嵌套参数分组。Laravel query builder可以处理这些:
DB::table('users')
-&where('name', '=', 'John')
-&orWhere(function($query)
$query-&where('votes', '&', 100)
-&where('title', '&&', 'Admin');
  上面的查询将产生以下SQL:
  select * from users where name = 'John' or (votes & 100 and title
&& 'Admin')
  Exists Statements
  DB::table('users')
  -&whereExists(function($query)
  $query-&select(DB::raw(1))
  -&from('orders')
  -&whereRaw('orders.user_id = users.id');
  -&get();
上面的查询将产生以下SQL:
select * from userswhere exists (
select 1 from orders where orders.user_id = users.id
查询构建器还提供了各种聚合方法,如统计,马克斯,min,avg和总和。
Using Aggregate Methods
$users = DB::table('users')-&count();
$price = DB::table('orders')-&max('price');
$price = DB::table('orders')-&min('price');
$price = DB::table('orders')-&avg('price');
$total = DB::table('users')-&sum('votes');
Raw Expressions
有时您可能需要使用一个原始表达式的查询。这些表达式将注入的查询字符串,所以小心不要创建任何SQL注入点!创建一个原始表达式,可以使用DB:rawmethod:
Using A Raw Expression
$users = DB::table('users')
-&select(DB::raw('count(*) as user_count, status'))
-&where('status', '&&', 1)
-&groupBy('status')
递增或递减一个列的值
DB::table('users')-&increment('votes');
DB::table('users')-&increment('votes', 5);
DB::table('users')-&decrement('votes');
DB::table('users')-&decrement('votes', 5);
您还可以指定额外的列更新:
  DB::table('users')-&increment('votes', 1, array('name' =& 'John'));
将记录插入表
DB::table('users')-&insert(
array('email' =& '', 'votes' =& 0)
将记录插入表自动增加的ID
如果表,有一个自动递增的id字段使用insertGetId插入一个记录和检索id:
$id = DB::table('users')-&insertGetId(
array('email' =& '', 'votes' =& 0)
注意:当使用PostgreSQL insertGetId方法预计,自增列被命名为“id”。
多个记录插入到表中
DB::table('users')-&insert(array(
array('email' =& '', 'votes' =& 0),
array('email' =& '', 'votes' =& 0),
四、Updates
更新一个表中的记录
DB::table('users')
-&where('id', 1)
-&update(array('votes' =& 1));
五、 Deletes
删除表中的记录
DB::table('users')-&where('votes', '&', 100)-&delete();
删除表中的所有记录
DB::table('users')-&delete();
删除一个表
DB::table('users')-&truncate();
六、Unions
查询构建器还提供了一种快速的方法来“联盟”两个查询:
  $first = DB::table('users')-&whereNull('first_name');
  $users =
DB::table('users')-&whereNull('last_name')-&union($first)-&get();
  unionAll方法也可以,有相同的方法签名。
  Pessimistic Locking
  查询构建器包括一些“悲观锁定”功能来帮助你做你的SELECT语句。  运行SELECT语句“共享锁”,你可以使用sharedLock方法查询:
DB::table('users')-&where('votes', '&',
100)-&sharedLock()-&get();
更新“锁”在一个SELECT语句,您可以使用lockForUpdate方法查询:
 DB::table('users')-&where('votes', '&', 100)-&lockForUpdate()-&get();
七、缓存查询
  你可以轻松地缓存查询的结果使用记忆法:
$users = DB::table('users')-&remember(10)-&get();
  在本例中,查询的结果将为十分钟被缓存。查询结果缓存时,不会对数据库运行,结果将从默认的缓存加载驱动程序指定您的应用程序。  如果您使用的是支持缓存的司机,还可以添加标签来缓存:
$users = DB::table('users')-&cacheTags(array('people', 'authors'))-&remember(10)-&get();
没有更多推荐了,在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
刚开始用laravel5.4,但是数据库现在没有直接返回数组,而是一个对象,即使用了toArray()方法,也是在数组里面返回一个对象,类似一下对象。以下是查询:
$userInfo = DB::table('admin_user')
-&select('id', 'password', 'rand_salt', 'state')
-&where('admin_name', $adminName)
-&toArray();
返回结果:
[0] =& stdClass Object
[password] =&
[rand_salt] =& 123
[state] =& 1
有没有可能直接返回数组?
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
DB::setFetchMode(\PDO::FETCH_ASSOC);
$userInfo = DB::table('admin_user')
-&select('id', 'password', 'rand_salt', 'state')
-&where('admin_name', $adminName)
DB::setFetchMode(\PDO::FETCH_CLASS);
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
先看看5.4手册中关于fetch模式的一段简述:
Laravel no longer includes the ability to customize the PDO “fetch mode” from your configuration files. Instead, PDO::FETCH_OBJ is always used. If you would still like to customize the fetch mode for your application you may listen for the new Illuminate\Database\Events\StatementPrepared event:
Event::listen(StatementPrepared::class, function ($event) {
$event-&statement-&setFetchMode(...);
大概意思也就是说从5.4开始, 不能再通过配置文件的方式去改变fetch mode了。而使用了事件监听设置去实现该配置。
解决方案:
打开app/Providers/EventServiceProvier.php, 按照官方文档,先引入IlluminateDatabaseEventsStatementPrepared类,然后在boot方法中加入上方样例代码,最终代码如下:
namespace App\P
use Illuminate\Support\Facades\E
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceP
use Illuminate\Database\Events\StatementP
class EventServiceProvider extends ServiceProvider
* The event listener mappings for the application.
* @var array
protected $listen = [
'App\Events\Event' =& [
'App\Listeners\EventListener',
* Register any events for your application.
* @return void
public function boot()
parent::boot();
Event::listen(StatementPrepared::class, function ($event) {
$event-&statement-&setFetchMode(\PDO::FETCH_ASSOC);
楼主需要先按照手册设置这么个大前提,然后再配合toArray方法,即可达到你想要的结果。
分享到微博?
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。15.9k 次阅读
标签:至少1个,最多5个
在Laravel5.* 中使用 AdminLTE
AdminLTE是一个很棒的单纯的由 HTML 和 CSS 构建的后台模板,在这片文章中,我将讲述如何将 AdminLTE 和 Laravel 优雅的整合在一起,而且我们可以通过 Bower 来及时的更新和管理 AdminLTE。
我们使用的工具
AdminLTE 2.3.2
下载一个全新的 Laravel
如果不太清楚可以去官方网站查看文档在此我们直接使用命令行即可
composer create-project laravel/laravel myapp --prefer-dist
通过这个命令我们创建了一个全新的名字为 myapp 的Laravel项目,如果你成功的话你可以看到下面的图片
通过 Bower 下载 AdminLTE
进入到 myapp/public 文件夹
cd myapp/public
在这个文件夹下执行下面的命令
bower install admin-lte
一旦完成,你会发现多了一个 bower_componets 的文件夹,而且在这个文件夹中你会看到 AdminLTE
将 AdminLTE 的starter.html 转化为 Blade 模板
Laravel 在此使用了一个很好的模板引擎 Blade,为了更充分的利用Blade,我们需要将一些常规的通用的 HTML 的 起始页面应用到 Blade 模板中,首先创建一个 view 在 resources/views文件夹中,命名为admin_template.blade.php,而后我们为这个页面创建一个对应的路由。如下面我所创建的
Route::get('admin', function () {
return view('admin_template');
然后,将bower_components/admin-lte/starter.html中的内容复制到我们视图模板中,并且将其中的相关链接指向我们的 AdminLTE 的对应目录下,如下是我初步的设置:
&script src="{{ asset("/bower_components/AdminLTE/plugins/jQuery/jQuery-2.1.4.min.js")}}"&&/script&
&!-- Bootstrap 3.3.5 --&
&script src="{{ asset("/bower_components/AdminLTE/bootstrap/js/bootstrap.min.js")}}"&&/script&
&!-- AdminLTE App --&
&script src="{{ asset("/bower_components/AdminLTE/dist/js/app.min.js")}}"&&/script&
类似这样,将css 和 js 的相关的链接指向相应的目录下,而后我们通过 localhost:8000/admin 查看页面的变化,此时页面变成了如下图:
现在我们拥有了所有的使用 AdminLTE 的所有的资源,下面对我们的主要视图增加最后的收尾工作,我将分开这个模板为三个文件,sidebar.blade.php, header.blade.php, 和 footer.blade.php这三个文件的内容分别是admin_template.blade.phpheader 部分和 aside 部分和footer 部分,将这三部分截取出来依次放到三个文件中。
最后的润色工作
现在我们已经将我们的模板个性化的分离开了,下面我们需要设置我们的最初的admin_template.blade.php模板以便于内容动态加载,如下所示:
&!DOCTYPE html&
&meta charset="UTF-8"&
&title&{{ $page_title or "AdminLTE Dashboard" }}&/title&
&meta content='width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no' name='viewport'&
&!-- Bootstrap 3.3.2 --&
&link href="{{ asset("/bower_components/AdminLTE/bootstrap/css/bootstrap.min.css") }}" rel="stylesheet" type="text/css" /&
&!-- Font Awesome Icons --&
&link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css" rel="stylesheet" type="text/css" /&
&!-- Ionicons --&
&link href="http://code.ionicframework.com/ionicons/2.0.0/css/ionicons.min.css" rel="stylesheet" type="text/css" /&
&!-- Theme style --&
&link href="{{ asset("/bower_components/AdminLTE/dist/css/AdminLTE.min.css")}}" rel="stylesheet" type="text/css" /&
&!-- AdminLTE Skins. We have chosen the skin-blue for this starter
page. However, you can choose any other skin. Make sure you
apply the skin class to the body tag so the changes take effect.
&link href="{{ asset("/bower_components/AdminLTE/dist/css/skins/skin-blue.min.css")}}" rel="stylesheet" type="text/css" /&
&!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries --&
&!-- WARNING: Respond.js doesn't work if you view the page via file:// --&
&!--[if lt IE 9]&
&script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"&&/script&
&script src="https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js"&&/script&
&![endif]--&
&body class="hold-transition skin-blue sidebar-mini"&
&div class="wrapper"&
&!-- Header --&
@include('header')
&!-- Sidebar --&
@include('sidebar')
&!-- Content Wrapper. Contains page content --&
&div class="content-wrapper"&
&!-- Content Header (Page header) --&
&section class="content-header"&
{{ $page_title or "Page Title" }}
&small&{{ $page_description or null }}&/small&
&!-- You can dynamically generate breadcrumbs here --&
&ol class="breadcrumb"&
&li&&a href="#"&&i class="fa fa-dashboard"&&/i& Level&/a&&/li&
&li class="active"&Here&/li&
&/section&
&!-- Main content --&
&section class="content"&
&!-- Your Page Content Here --&
@yield('content')
&/section&&!-- /.content --&
&/div&&!-- /.content-wrapper --&
&!-- Footer --&
@include('footer')
&aside class="control-sidebar control-sidebar-dark"&
&!-- Create the tabs --&
&ul class="nav nav-tabs nav-justified control-sidebar-tabs"&
&li class="active"&&a href="#control-sidebar-home-tab" data-toggle="tab"&&i class="fa fa-home"&&/i&&/a&&/li&
&li&&a href="#control-sidebar-settings-tab" data-toggle="tab"&&i class="fa fa-gears"&&/i&&/a&&/li&
&!-- Tab panes --&
&div class="tab-content"&
&!-- Home tab content --&
&div class="tab-pane active" id="control-sidebar-home-tab"&
&h3 class="control-sidebar-heading"&Recent Activity&/h3&
&ul class="control-sidebar-menu"&
&a href="javascript::;"&
&i class="menu-icon fa fa-birthday-cake bg-red"&&/i&
&div class="menu-info"&
&h4 class="control-sidebar-subheading"&Langdon's Birthday&/h4&
&p&Will be 23 on April 24th&/p&
&!-- /.control-sidebar-menu --&
&h3 class="control-sidebar-heading"&Tasks Progress&/h3&
&ul class="control-sidebar-menu"&
&a href="javascript::;"&
&h4 class="control-sidebar-subheading"&
Custom Template Design
&span class="label label-danger pull-right"&70%&/span&
&div class="progress progress-xxs"&
&div class="progress-bar progress-bar-danger" style="width: 70%"&&/div&
&!-- /.control-sidebar-menu --&
&!-- /.tab-pane --&
&!-- Stats tab content --&
&div class="tab-pane" id="control-sidebar-stats-tab"&Stats Tab Content&/div&
&!-- /.tab-pane --&
&!-- Settings tab content --&
&div class="tab-pane" id="control-sidebar-settings-tab"&
&form method="post"&
&h3 class="control-sidebar-heading"&General Settings&/h3&
&div class="form-group"&
&label class="control-sidebar-subheading"&
Report panel usage
&input type="checkbox" class="pull-right" checked&
Some information about this general settings option
&!-- /.form-group --&
&!-- /.tab-pane --&
&!-- /.control-sidebar --&
&!-- Add the sidebar's background. This div must be placed
immediately after the control sidebar --&
&div class="control-sidebar-bg"&&/div&
&/div&&!-- ./wrapper --&
&!-- REQUIRED JS SCRIPTS --&
&!-- jQuery 2.1.3 --&
&script src="{{ asset ("/bower_components/AdminLTE/plugins/jQuery/jQuery-2.1.3.min.js") }}"&&/script&
&!-- Bootstrap 3.3.2 JS --&
&script src="{{ asset ("/bower_components/AdminLTE/bootstrap/js/bootstrap.min.js") }}" type="text/javascript"&&/script&
&!-- AdminLTE App --&
&script src="{{ asset ("/bower_components/AdminLTE/dist/js/app.min.js") }}" type="text/javascript"&&/script&
&!-- Optionally, you can add Slimscroll and FastClick plugins.
Both of these plugins are recommended to enhance the
user experience --&
在上面代码中,我们添加了contetn,这里包含着我们的主要的内容,增加了页面标题针对不同的页面,将其重命名为dashboard.blade.php现在这个模板已经可以使用了。
为了验证我们之前所做的工作,我将创建一个简单的页面
1.创建 test.blade.php
@extends('dashboard')
@section('content')
&div class='row'&
&div class='col-md-6'&
&!-- Box --&
&div class="box box-primary"&
&div class="box-header with-border"&
&h3 class="box-title"&Randomly Generated Tasks&/h3&
&div class="box-tools pull-right"&
&button class="btn btn-box-tool" data-widget="collapse" data-toggle="tooltip" title="Collapse"&&i class="fa fa-minus"&&/i&&/button&
&button class="btn btn-box-tool" data-widget="remove" data-toggle="tooltip" title="Remove"&&i class="fa fa-times"&&/i&&/button&
&div class="box-body"&
@foreach($tasks as $task)
{{ $task['name'] }}
&small class="label label-{{$task['color']}} pull-right"&{{$task['progress']}}%&/small&
&div class="progress progress-xxs"&
&div class="progress-bar progress-bar-{{$task['color']}}" style="width: {{$task['progress']}}%"&&/div&
@endforeach
&/div&&!-- /.box-body --&
&div class="box-footer"&
&form action='#'&
&input type='text' placeholder='New task' class='form-control input-sm' /&
&/div&&!-- /.box-footer--&
&/div&&!-- /.box --&
&/div&&!-- /.col --&
&div class='col-md-6'&
&!-- Box --&
&div class="box box-primary"&
&div class="box-header with-border"&
&h3 class="box-title"&Second Box&/h3&
&div class="box-tools pull-right"&
&button class="btn btn-box-tool" data-widget="collapse" data-toggle="tooltip" title="Collapse"&&i class="fa fa-minus"&&/i&&/button&
&button class="btn btn-box-tool" data-widget="remove" data-toggle="tooltip" title="Remove"&&i class="fa fa-times"&&/i&&/button&
&div class="box-body"&
A separate section to add any kind of widget. Feel free
to explore all of AdminLTE widgets by visiting the demo page
on &a href="https://almsaeedstudio.com"&Almsaeed Studio&/a&.
&/div&&!-- /.box-body --&
&/div&&!-- /.box --&
&/div&&!-- /.col --&
&/div&&!-- /.row --&
@endsection
2.创建TestController.php
php artisan make:controller TestController --plain
下面是这个控制器的代码部分:
namespace App\Http\C
use Illuminate\Http\R
use App\Http\R
use App\Http\Controllers\C
class TestController extends Controller
public function index() {
$data['tasks'] = [
'name' =& 'Design New Dashboard',
'progress' =& '87',
'color' =& 'danger'
'name' =& 'Create Home Page',
'progress' =& '76',
'color' =& 'warning'
'name' =& 'Some Other Task',
'progress' =& '32',
'color' =& 'success'
'name' =& 'Start Building Website',
'progress' =& '56',
'color' =& 'info'
'name' =& 'Develop an Awesome Algorithm',
'progress' =& '10',
'color' =& 'success'
return view('test')-&with($data);
3.创建对应的路由
Route::get('test', 'TestController@index');
4.打开对应的页面,如果你没有出错的 应该如下图所示
这样整个过程就完成了,当然有什么问题可以下面留言。
6 收藏&&|&&23
你可能感兴趣的文章
受教了,不过 Bower是什么工具呢?laravel里带的么?
受教了,不过 Bower是什么工具呢?laravel里带的么?
前端软件包管理工具,你可以google下。
前端软件包管理工具,你可以google下。
好文章,一点小建议,可以使用.bowerrc配置vendor目录,把bower下载的包都放到vendor里统一管理,最后使用gulp把需要的代码copy到public下,这样代码更整洁
好文章,一点小建议,可以使用.bowerrc配置vendor目录,把bower下载的包都放到vendor里统一管理,最后使用gulp把需要的代码copy到public下,这样代码更整洁
你说的这个具体怎么操作呀?我也想所有的项目都公用这个模板,不想每个项目都搞一个vendor目录,我的邮箱
你说的这个具体怎么操作呀?我也想所有的项目都公用这个模板,不想每个项目都搞一个vendor目录,我的邮箱
你好,请问如何使用gulp把admin_lte复制到public下呢。和我直接 copy admin_lte public/ 有区别吗
你好,请问如何使用gulp把admin_lte复制到public下呢。和我直接 copy admin_lte public/ 有区别吗
你可能感兴趣的文章
分享到微博?
我要该,理由是:
在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
请问是编码问题吗,在本地win环境下显示是没问题的,在linux中就有问题了,连得是同一个数据库,请问是编码的问题吗还是别的?
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
编码是不是都是utf8 呢?
同步到新浪微博
分享到微博?
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。

我要回帖

更多关于 laravel admin 的文章

 

随机推荐