广告:宝塔Linux面板高效运维的服务器管理软件 点击【 https://www.bt.cn/p/uNLv1L 】立即购买
给大家提供一些 Laravel 使用的小技巧, 当然你有任何想法欢迎 PR !
控制器单行为控制器Github 地址:https://github.com/LaravelDaily/laravel-tips
当你的控制器仅有一个方法的时候,不妨尝试下 __invoke()
方法来,让当前控制器变身为 “invokable” 控制器。
想要了解单行为控制器的好处以及用法请参考:
翻译:Laravel 应用设计:单行为控制器的魅力翻译:如何更好地使用单行为控制器单行为控制器的简单使用:
定义路由,如下:
Route::get('user/{id}', 'ShowProfile');登录后复制
通过命令创建单行为控制器:
php artisan make:controller ShowProfile --invokable登录后复制
修改控制器代码,如下:
class ShowProfile extends Controller{ public function __invoke($id) { return view('user.profile', [ 'user' => User::findOrFail($id) ]); }}登录后复制重定向到指定控制器的指定方法
你可以通过 redirect()
重定向到某个路由或者某个链接,但是当你希望重定向到一个特定方法,并且需要携带一些参数的时候,action 方法可以帮你实现,代码如下:
return redirect()->action('SomeController@method', ['param' => $value]);登录后复制接口操作成功而无返回的简单处理
当你在接口执行了某些逻辑,但是不需要返回内容的时候,你可以直接返回 204 状态码。 在 Laravel 中这很容易实现:
Tips: 204 状态码说明
public function reorder(Request $request){ foreach ($request->input('rows', []) as $row) { Country::find($row['id'])->update(['position' => $row['position']]); } return response()->noContent();}登录后复制模型Eloquent 的日期筛选
Laravel 的 Eloquent Orm 提供了 whereDay()
, whereMonth()
, whereYear()
, whereDate()
和 whereTime()
供你对日期进行筛选。简单例子:
$products = Product::whereDate('created_at', '2018-01-31')->get();$products = Product::whereMonth('created_at', '12')->get();$products = Product::whereDay('created_at', '31')->get();$products = Product::whereYear('created_at', date('Y'))->get();$products = Product::whereTime('created_at', '=', '14:13:58')->get();登录后复制Inter 类型数据的便捷操作 Increments(增加) 和 decrements(减少)
你如果仅仅是操作数字类型字段的增加(减少),你可以尝试下 increment()
(decrement()
) 方法:
Post::find($post_id)->increment('view_count');User::find($user_id)->increment('points', 50);登录后复制获取设置当前用户登录的信息
你可以使用 make:observer
来创建一个观察者,然后通过修改模型事件 creating()
来设定当前用户的信息,代码如下 :详细使用可以查阅 Laravel 中的模型事件与 Observer
class PostObserver{ public function creating(Post $post) { $post->user_id = auth()->id(); }}登录后复制软删除后的数据批量恢复
当使用软删除删除数据之后,你可以通过以下方法批量恢复删除的数据:
Post::withTrashed()->where('author_id', 1)->restore();登录后复制特定模型字段的返回
默认的 Model::all()
会返回所有字段,不管你是否有需要,当然你也可以通过给 all()
传递参数来指定返回的列。如下:
$users = User::all(['id', 'name', 'email']);登录后复制失败或者成功的查询
findOrFail()
方法,可以在查询没有符合条件数据的时候直接抛出异常。
php artisan make:controller ShowProfile --invokable0登录后复制数据返回的列名称的自定义
在 Eloquent 查询中使用 select 可以设置查询的字段,然后你可以通过 “as” 给字段重命名为你想要的名称:
php artisan make:controller ShowProfile --invokable1登录后复制查询结果的 Map 处理
由于 Eloquent 中,get 方法将返回 Collection 类型的数据,所以在通过 get 方法获取数据之后,你可以直接通过 map()
方法来处理:
php artisan make:controller ShowProfile --invokable2登录后复制不使用 timestamps 相关字段
默认的,laravel 会在 migration 以及 model 中添加 timestamps 相关字段(created_at,updated_at),如果你不想使用他,你可以在migrate 中移除相关字段,或者在 model 中设置 timestamps
属性,将该属性设置为 false
即可实现:
php artisan make:controller ShowProfile --invokable3登录后复制修改默认时间字段
当你想要在已存在的数据库中使用 Laraevl 的 Eloquent Orm的时候,你的时间字段又不同于 Laravel 默认字段,这时候怎么处理呢?你可以通过给以下常量重新赋值来设置当前使用的时间戳字段:
php artisan make:controller ShowProfile --invokable4登录后复制快速通过 created_at 排序
在此之前你是这样实现的:
php artisan make:controller ShowProfile --invokable5登录后复制
当然,你也可以使用更简单的方式:
php artisan make:controller ShowProfile --invokable6登录后复制
默认 latest()
会通过 created_at
进行排序。
这里还有个反方法可以用: oldest()
将会通过 created_at
字段进行升序排序。
php artisan make:controller ShowProfile --invokable7登录后复制
当然你也可以通过传递参数来执行想要进行排序的字段,如下:
php artisan make:controller ShowProfile --invokable8登录后复制创建记录时的自增
当你在创建记录的时候,你同时希望对某个字段进行自增操作的时候,你可以在 boot()
方法中注册 creating 方法来实现。举个例子,现在你有个 “position” 字段,你希望在你完成新增操作的时候同时对该字段 +1 ,实现代码如下:
php artisan make:controller ShowProfile --invokable9登录后复制使用
whereRaw()
使查询效率更快使用 whereRaw()
方法,通常可以使查询效率更高。例如你想获取 30+ 天未登录的用户,你可以通过以下实现:
class ShowProfile extends Controller{ public function __invoke($id) { return view('user.profile', [ 'user' => User::findOrFail($id) ]); }}0登录后复制多个作用域
你可以同时创建多个作用域,当然可以在一个查询中使用多个作用域。
模型中定义:
class ShowProfile extends Controller{ public function __invoke($id) { return view('user.profile', [ 'user' => User::findOrFail($id) ]); }}1登录后复制
controller 中使用:
class ShowProfile extends Controller{ public function __invoke($id) { return view('user.profile', [ 'user' => User::findOrFail($id) ]); }}2登录后复制Carbon自动转换
如果你想使用 whereDate()
查询今天的记录,你可以通过直接 now()
而无需进行 ->toDateString()
,因为他会自动转换。
class ShowProfile extends Controller{ public function __invoke($id) { return view('user.profile', [ 'user' => User::findOrFail($id) ]); }}3登录后复制通过首字符分组
你可以通过任意你想实现的方式进行分组,下面是通过对姓名首字符的分组方法:
class ShowProfile extends Controller{ public function __invoke($id) { return view('user.profile', [ 'user' => User::findOrFail($id) ]); }}4登录后复制限制数据列的更新
如果你希望设置一个不可更新的列,你可以通过以下方式实现:
class ShowProfile extends Controller{ public function __invoke($id) { return view('user.profile', [ 'user' => User::findOrFail($id) ]); }}5登录后复制查询多个
Eloquent 方法 find()
可以通过传递数组参数实现多个记录的查询:
class ShowProfile extends Controller{ public function __invoke($id) { return view('user.profile', [ 'user' => User::findOrFail($id) ]); }}6登录后复制使用 UUID 替代 自增列
如果你不想在数据表中使用自增列要怎么办?下面叫你如何实现
数据迁移:
class ShowProfile extends Controller{ public function __invoke($id) { return view('user.profile', [ 'user' => User::findOrFail($id) ]); }}7登录后复制
模型:
class ShowProfile extends Controller{ public function __invoke($id) { return view('user.profile', [ 'user' => User::findOrFail($id) ]); }}8登录后复制模型关联可排序的模型关联
你可以在你的关联中使用 orderBy对关联进行排序:
class ShowProfile extends Controller{ public function __invoke($id) { return view('user.profile', [ 'user' => User::findOrFail($id) ]); }}9登录后复制有条件的模型关联
如果你在使用模型关联的时候经常需要额外的进行 where 查询,你可以直接通过对关联进行条件查询,实现方式如下:
Model:
return redirect()->action('SomeController@method', ['param' => $value]);0登录后复制对结果的筛选:havingRaw()
你可以在各种地方使用 RAW DB 查询,包括 groupBy()
和 havingRaw()
后面:
return redirect()->action('SomeController@method', ['param' => $value]);1登录后复制Eloquent has() 方法可以作用于深层的关联
Eloquent has()
方法可以通过 books.ratings
的方式,而使查询可以做用于更深层的关联上!
return redirect()->action('SomeController@method', ['param' => $value]);2登录后复制通过 Has 方法对 hasMany 数据限制
在一对多关联中, hasMany()
允许通过 has()
方法进行关联数据条数的限制:
return redirect()->action('SomeController@method', ['param' => $value]);3登录后复制模型默认值
你可以通过 belongsTo
关联, to avoid fatal errors when calling it like {{ $post->user->name }}
if $post->user doesn’t exist.
return redirect()->action('SomeController@method', ['param' => $value]);4登录后复制一次性创建多条关联记录
如果你定义了 hasMany()
关联,你可以通过 saveMany()
来一次性创建多条关联数据:
return redirect()->action('SomeController@method', ['param' => $value]);5登录后复制快速且精确的加载
通过 with 你可以获取关联表甚至特定字段信息:
return redirect()->action('SomeController@method', ['param' => $value]);6登录后复制
你可以使用他获取更深一层次的关联:
return redirect()->action('SomeController@method', ['param' => $value]);7登录后复制上级信息的级联更新
例如你想在更新评论信息的时候想同时更新上级关联的帖子信息的 updated_at 字段,你可以通过指定 $touch 属性实现:
return redirect()->action('SomeController@method', ['param' => $value]);8登录后复制总是检测关联是否存在
永远不要在未检测关联是否存在的情况下使用 $model->relationship->field
。
It may be deleted for whatever reason, outside your code, by someone else’s queued job etc.
可以通过 if-else
,在 Blade 中使用 {{ $model->relationship->field ?? '' }}
, 或者 {{ optional($model->relationship)->field }}
进行检测。
如果你定义了 hasMany()
关联,当你想要统计关联数据的数量的时候,尝试下 withCount
吧。例子, 假如你有一个 Post 模型,该模型会有多个 Comments 关联,看下如何使用 withCount()
吧:
return redirect()->action('SomeController@method', ['param' => $value]);9登录后复制
然后在模板文件中使用 {relationship}_count
属性就可以获取相应的数据统计了:
public function reorder(Request $request){ foreach ($request->input('rows', []) as $row) { Country::find($row['id'])->update(['position' => $row['position']]); } return response()->noContent();}0登录后复制关联查询的筛选条件
如果你想要在加载关联的时候做一些条件限制,可以通过回调函数实现。例如你想获取国家的前3个城市,可以通过以下代码实现:
public function reorder(Request $request){ foreach ($request->input('rows', []) as $row) { Country::find($row['id'])->update(['position' => $row['position']]); } return response()->noContent();}1登录后复制始终加载关联
你即可以通过 $with
属性设置模型始终会加载的关联,也可以在构造函数中动态处理加载项:
public function reorder(Request $request){ foreach ($request->input('rows', []) as $row) { Country::find($row['id'])->update(['position' => $row['position']]); } return response()->noContent();}2登录后复制belongsTo 和 hasMany 的使用
定义 belongsTo
关联和 hasMany
关联,这样可以在创建关联数据的时候有由系统填充关联字段信息:
public function reorder(Request $request){ foreach ($request->input('rows', []) as $row) { Country::find($row['id'])->update(['position' => $row['position']]); } return response()->noContent();}3登录后复制自定义归属关联名称
使用 as 可以重命名您的关联:
模型中定义:
public function reorder(Request $request){ foreach ($request->input('rows', []) as $row) { Country::find($row['id'])->update(['position' => $row['position']]); } return response()->noContent();}4登录后复制
控制器中使用:
public function reorder(Request $request){ foreach ($request->input('rows', []) as $row) { Country::find($row['id'])->update(['position' => $row['position']]); } return response()->noContent();}5登录后复制数据迁移迁移执行顺序
通过修改迁移文件的时间戳前缀可以达到排序迁移执行数据的目的。例如:将2018_08_04_070443_create_posts_table.php
修改为 2018_07_04_070443_create_posts_table.php
( 修改 2018_08_04
为 2018_07_04
).
迁移中 timestamps()
和 timestampsTz()
都可以设定时区。
public function reorder(Request $request){ foreach ($request->input('rows', []) as $row) { Country::find($row['id'])->update(['position' => $row['position']]); } return response()->noContent();}6登录后复制
另外还有 dateTimeTz()
, timeTz()
, timestampTz()
, softDeletesTz()
.
一些特定值得迁移类型:
public function reorder(Request $request){ foreach ($request->input('rows', []) as $row) { Country::find($row['id'])->update(['position' => $row['position']]); } return response()->noContent();}7登录后复制
更多类型查阅: official documentation.
默认时间戳通过 timestamp()
设定列为时间戳类型,通过useCurrent()
设定该列的默认值。
public function reorder(Request $request){ foreach ($request->input('rows', []) as $row) { Country::find($row['id'])->update(['position' => $row['position']]); } return response()->noContent();}8登录后复制视图foreach 中 $loop 的使用
通过 $loop
判断该数据是否是最先/最后的数据:
public function reorder(Request $request){ foreach ($request->input('rows', []) as $row) { Country::find($row['id'])->update(['position' => $row['position']]); } return response()->noContent();}9登录后复制
当然他还有其他可用属性例如: $loop->iteration
和$loop->count
.详情阅读: official documentation.
在你加载 view 之前你可以判断 view 是否存在,从而避免不必要的错误显示。
$products = Product::whereDate('created_at', '2018-01-31')->get();$products = Product::whereMonth('created_at', '12')->get();$products = Product::whereDay('created_at', '31')->get();$products = Product::whereYear('created_at', date('Y'))->get();$products = Product::whereTime('created_at', '=', '14:13:58')->get();0登录后复制
你可以提供多个 view 供选择:
$products = Product::whereDate('created_at', '2018-01-31')->get();$products = Product::whereMonth('created_at', '12')->get();$products = Product::whereDay('created_at', '31')->get();$products = Product::whereYear('created_at', date('Y'))->get();$products = Product::whereTime('created_at', '=', '14:13:58')->get();1登录后复制错误模板页面
快速创建特定错误的页面,你只要以该错误code命名并创建相应的 blade 即可。例如: 500(resources/views/errors/500.blade.php)/403(resources/views/errors/403.blade.php),系统会通过相应的 code 自动匹配错误显示页面。
直接使用 view可以直接在路由中绑定需要显示的 view:
$products = Product::whereDate('created_at', '2018-01-31')->get();$products = Product::whereMonth('created_at', '12')->get();$products = Product::whereDay('created_at', '31')->get();$products = Product::whereYear('created_at', date('Y'))->get();$products = Product::whereTime('created_at', '=', '14:13:58')->get();2登录后复制Blade @auth
在 Blade 中直接使用 auth()
可以判断以及获取当前登录的用户信息:
例子:
$products = Product::whereDate('created_at', '2018-01-31')->get();$products = Product::whereMonth('created_at', '12')->get();$products = Product::whereDay('created_at', '31')->get();$products = Product::whereYear('created_at', date('Y'))->get();$products = Product::whereTime('created_at', '=', '14:13:58')->get();3登录后复制
或者更简单的方式:
$products = Product::whereDate('created_at', '2018-01-31')->get();$products = Product::whereMonth('created_at', '12')->get();$products = Product::whereDay('created_at', '31')->get();$products = Product::whereYear('created_at', date('Y'))->get();$products = Product::whereTime('created_at', '=', '14:13:58')->get();4登录后复制
相反的方法 @guest
:
$products = Product::whereDate('created_at', '2018-01-31')->get();$products = Product::whereMonth('created_at', '12')->get();$products = Product::whereDay('created_at', '31')->get();$products = Product::whereYear('created_at', date('Y'))->get();$products = Product::whereTime('created_at', '=', '14:13:58')->get();5登录后复制Blade中循环嵌套中使用 $loop
Blade 循环嵌套,可以通过 $loop
获取上层数据:
$products = Product::whereDate('created_at', '2018-01-31')->get();$products = Product::whereMonth('created_at', '12')->get();$products = Product::whereDay('created_at', '31')->get();$products = Product::whereYear('created_at', date('Y'))->get();$products = Product::whereTime('created_at', '=', '14:13:58')->get();6登录后复制自定义 Blade 指令
Laravel 提供了简单的方式自定义 Blade 指令,只需在 app/Providers/AppServiceProvider.php
注册自己的指令即可。例子:你想要使用新的标签替换 <br>
标签:
$products = Product::whereDate('created_at', '2018-01-31')->get();$products = Product::whereMonth('created_at', '12')->get();$products = Product::whereDay('created_at', '31')->get();$products = Product::whereYear('created_at', date('Y'))->get();$products = Product::whereTime('created_at', '=', '14:13:58')->get();7登录后复制
将该指令添加到 AppServiceProvider 的 boot()
方法中:
$products = Product::whereDate('created_at', '2018-01-31')->get();$products = Product::whereMonth('created_at', '12')->get();$products = Product::whereDay('created_at', '31')->get();$products = Product::whereYear('created_at', date('Y'))->get();$products = Product::whereTime('created_at', '=', '14:13:58')->get();8登录后复制Blade 指令说明: IncludeIf, IncludeWhen, IncludeFirst
当你不确定 Blade 的组件是否存在的时候可以使用一下方法:
仅仅在存在时加载该组件:
$products = Product::whereDate('created_at', '2018-01-31')->get();$products = Product::whereMonth('created_at', '12')->get();$products = Product::whereDay('created_at', '31')->get();$products = Product::whereYear('created_at', date('Y'))->get();$products = Product::whereTime('created_at', '=', '14:13:58')->get();9登录后复制
仅仅在有权限的时候加载该组件
Post::find($post_id)->increment('view_count');User::find($user_id)->increment('points', 50);0登录后复制
当该组件不存在时,会加载默认组件:
Post::find($post_id)->increment('view_count');User::find($user_id)->increment('points', 50);1登录后复制路由路由组嵌套
路由组可以使用嵌套:
Post::find($post_id)->increment('view_count');User::find($user_id)->increment('points', 50);2登录后复制子域通配符
你可以通过动态子域名创建相应的路由:
Post::find($post_id)->increment('view_count');User::find($user_id)->increment('points', 50);3登录后复制What’s behind the routes?
Auth::routes()
下包含了那些路由呢?你可以在 /vendor/laravel/ui/src/AuthRouteMethods.php
找到:
Post::find($post_id)->increment('view_count');User::find($user_id)->increment('points', 50);4登录后复制
Laravel 7 之前, 存在与文件 /vendor/laravel/framework/src/illuminate/Routing/Router.php
。
你可以通过绑定 user 参数 Route::get('api/users/{user}', function (App\User $user) { … }
- 不仅仅可以通过自增 ID 字段筛选,也可以使用 {user}
的 username
字段筛选,只要在模型中这样处理即可:
Post::find($post_id)->increment('view_count');User::find($user_id)->increment('points', 50);5登录后复制快速定义路由控制器
在此之前,你可能这样写:
Post::find($post_id)->increment('view_count');User::find($user_id)->increment('points', 50);6登录后复制
上面写法在编辑器中无法从 route 直接跳转到相应的 controller 中,尝试一下方法:
Post::find($post_id)->increment('view_count');User::find($user_id)->increment('points', 50);7登录后复制
现在你可以在编辑器中直接点击 PageController 编辑器会根据路径自动找到相关文件(这需要你的编辑器支持,像 phpstorm)。
路由默认值如果你你不想在路由匹配失败时显示 404 错误页面,你可以通过回调函数设置默认显示内容,这样在路由匹配失败的时候会直接显示你自定义的内容:
Post::find($post_id)->increment('view_count');User::find($user_id)->increment('points', 50);8登录后复制使用正则验证路由参数
我们可以直接在路由定义时使用 “where” 方法验证路由参数。一个非常典型的情况是在路由的前面加上语言设置, 像 fr/blog
和 en/article/333
这样。我们如何确保这两个首字母不用于语言以外的其他字符串?
routes/web.php
:
Post::find($post_id)->increment('view_count');User::find($user_id)->increment('points', 50);9登录后复制全局,访客,用户的限流
你可以通过 throttle:60,1
来限制单位时间内请求某个可连接的此处:
class PostObserver{ public function creating(Post $post) { $post->user_id = auth()->id(); }}0登录后复制
你可以针对不同用户组进行不同限制:
class PostObserver{ public function creating(Post $post) { $post->user_id = auth()->id(); }}1登录后复制
Also, you can have a DB field users.rate_limit and limit the amount for specific user:
class PostObserver{ public function creating(Post $post) { $post->user_id = auth()->id(); }}2登录后复制路由的Query params 参数设置
你可以通过 route 方法第二个参数,以数组的形式将query 参数绑定到路由:
class PostObserver{ public function creating(Post $post) { $post->user_id = auth()->id(); }}3登录后复制验证图片验证
你可以验证上传图片的尺寸:
class PostObserver{ public function creating(Post $post) { $post->user_id = auth()->id(); }}4登录后复制自定义验证错误消息
可以自定义现有规则的错误消息,只需要创建相应的语言文件即可 resources/lang/xx/validation.php
:
class PostObserver{ public function creating(Post $post) { $post->user_id = auth()->id(); }}5登录后复制时间验证中的 “now” 和 “yesterday”关键字
您可以通过 before/after
规则来验证日期,并将各种字符串作为参数传递,例如:tomorrow
, now
, yesterday
。 例如:'start_date' => 'after:now'
。 它在底层使用 strtotime()
验证。
class PostObserver{ public function creating(Post $post) { $post->user_id = auth()->id(); }}6登录后复制有条件的验证规则
如果你的验证规则需要同时满足额外的条件,在 FormRequest
方法中定义 withValidator()
添加你的条件即可:
class PostObserver{ public function creating(Post $post) { $post->user_id = auth()->id(); }}7登录后复制自定义验证消息
通过FormRequest
的 messages()
方法,你可以自定义验证错误提示信息:
class PostObserver{ public function creating(Post $post) { $post->user_id = auth()->id(); }}8登录后复制验证前置操作
验证前置操作,如果你需要在验证之前对某些字段做一些处理, prepareForValidation()
可以实现该功能:
class PostObserver{ public function creating(Post $post) { $post->user_id = auth()->id(); }}9登录后复制遇到错误时终止验证
默认情况下,laraevl 会在处理完成所有验证规则之后,将错误信息一并返回;当然如果你想在遇到第一个错误的时候就终止继续往下的验证你可以通过添加一下规则: bail
Post::withTrashed()->where('author_id', 1)->restore();0登录后复制Policies一次性检测多个权限
@can
Blade 指令可以检测当前用户是否有某个权限,但是当场景复杂点要怎么处理?比如当我在同时拥有多个权限才能进行某个操作的时候? @canany
指令了解下:
Post::withTrashed()->where('author_id', 1)->restore();1登录后复制集合不要在集合过滤中使用 NULL
你可以在 Eloquent 中使用 Null 过滤,但是在集合( collection )中,Null 过滤将不会生效:
Post::withTrashed()->where('author_id', 1)->restore();2登录后复制在集合上使用自定义 groupBy 回调
如果你想根据某些条件对结果进行分组处理,并且该条件列并非数据库字段,你可以通过 GroupBy 回调实现。
例如,如果你想按注册日期对用户进行分组,代码如下:
Post::withTrashed()->where('author_id', 1)->restore();3登录后复制
⚠️ Notice: User::all()
将返回集合类型数据,因此这是在集合上进行的 GroupBy
操作
当你在查询结果上使用 ->all()
或者 ->get()
方法的时候,该操作是针对结果集合进行的操作,不会再额外的进行查询操作。
Post::withTrashed()->where('author_id', 1)->restore();4登录后复制鉴权你链接 Auth::once() 吗?
Auth::once()
可以用于构建无状态请求,他不会产生任何 cookie信息,这很有利于接口的开发:
Post::withTrashed()->where('author_id', 1)->restore();5登录后复制更新密码同时更新用户 token
在更新用户密码的同时更新用户 token 很有必要:
模型:
Post::withTrashed()->where('author_id', 1)->restore();6登录后复制邮件将测试邮件存储到 laravel.log
开发过程中,你可能需要测试邮件发送,但是你有不希望测试邮件真正发送到客户邮箱,这时候你可以通过配置 .env
参数 MAIL_DRIVER=log
这样,邮件将会以文本的形式存储到 storage/logs/laravel.log
,而不会真正发送出去。
如果你使用 Mailables 为发送邮件提供服务,那么你可以直接在浏览器中浏览邮件预览,而不必真正的发送:
Post::withTrashed()->where('author_id', 1)->restore();7登录后复制Laravel 通知的默认主题(subject)
如果你在使用 toMail() 发送邮件通知的时候,未指定相关主题(subject)laravel 提供了默认参数可以使用:
因此,你只需要有:
Post::withTrashed()->where('author_id', 1)->restore();8登录后复制
然后你就可以在注册完成收到一封注册邮件提醒。
发送通知你可以通过 $user->notify()
发送通知给特定用户,你也可以通过 Notification::route()
发送给任何其他需要通知的地方:
Post::withTrashed()->where('author_id', 1)->restore();9登录后复制ArtisanArtisan 命令参数
当我们创建我们的 Artisan 命令的时候,可以通过 $this->confirm()
, $this->anticipate()
, $this->choice()
等方法询问并要求输入参数:
$users = User::all(['id', 'name', 'email']);0登录后复制维护模式
页面维护模式实现如下:
$users = User::all(['id', 'name', 'email']);1登录后复制
执行上面命令后,再访问站点的时候会得到 503 错误信息。
你也可以通过提供参数实现而外的效果:
message 参数指定显示信息retry 参数设定页面重载时间allow 允许访问的 IP$users = User::all(['id', 'name', 'email']);1 --message="Upgrading Database" --retry=60 --allow=127.0.0.1登录后复制
当维护完成,运行一下命令上线吧!
$users = User::all(['id', 'name', 'email']);3登录后复制数据工厂Factory 的回调方法
有时候,你某些数据的插入/修改需要基于其他数据的完成,这时你可以通过回调方法实现,例子如下:
$users = User::all(['id', 'name', 'email']);4登录后复制通过 Seeds/Factories 生成图片
Faker能生成的不仅仅是文本,还可以生成指定大小的图像:
$users = User::all(['id', 'name', 'email']);5登录后复制日志和调试给日志记录传递参数
你可以通过 Log::info()
来记录日志,或者 info()
快捷方法可以实现同样的效果。
$users = User::all(['id', 'name', 'email']);6登录后复制更方便的方法 DD
你可以直接通过在查询结果之后的 ->dd()
操作来打印结果。
$users = User::all(['id', 'name', 'email']);7登录后复制
【相关推荐:laravel视频教程】
以上就是如何快速上手 Laravel ?100 个实用小技巧分享的详细内容,更多请关注9543建站博客其它相关文章!
发表评论