Laravel 使用技巧

Job允许脱离队列

只需在控制器中调用 $this->dispatchNow() 即可。

public function approve(Article $article)
{    $this->dispatchNow(new ApproveArticle($article));}

获取数据的方法

如果你有一个具有复杂数据结构的数组,例如带对象嵌套的数组,你可以使用 data_get() 助手函数配合通配符和「点」符号,来从嵌套数组或对象中检索值。

// 我们有如下数组
[ 0 => 
['user_id' =>'用户id1', 'created_at' => '时间戳1', 'product' => {object Product}, ...], 
  1 => 
['user_id' =>'用户id2', 'created_at' => '时间戳2', 'product' => {object Product}, ...], 
  2 => ...
]

// 现在我们想要获取其中全部的产品id,我们可以这样写:
data_get($yourArray, '*.product.id');
// 这样我们就获取了全部的产品 id [1, 2, 3, 4, 5, ...]

 

可以定时执行的事情

你可以安排 artisan 命令、作业类、可调用类、回调函数、甚至是 shell 脚本去定时执行

use App\Jobs\Heartbeat;

$schedule->job(new Heartbeat)->everyFiveMinutes();
$schedule->exec('node /home/forge/script.js')->daily();
use App\Console\Commands\SendEmailsCommand;

$schedule->command('emails:send Taylor --force')->daily();

$schedule->command(SendEmailsCommand::class, ['Taylor', '--force'])->daily();
protected function schedule(Schedule $schedule)
{
    $schedule->call(function () {
        DB::table('recent_users')->delete();
    })->daily();
}

数据库原始查询计算运行得更快

使用类似 whereRaw() 方法的 SQL 原始查询,直接在查询中进行一些特定于数据库的计算,而不是在 Laravel 中,通常结果会更快。 例如,如果您想获得注册后 30 天以上仍处于活跃状态的用户,请使用以下代码:

User::where('active', 1)
->whereRaw('TIMESTAMPDIFF(DAY, created_at, updated_at) > ?', 30)
->get();

保存时移除缓存

如果您有提供集合 posts 这样的缓存键,想在新增或更新时移除缓存键,可以在您的模型上调用静态的 saved 函数:

class Post extends Model
{
    // 存储或更新时移除缓存
    public static function boot()
    {
        parent::boot();
        static::saved(function () {
           Cache::forget('posts');
        });
    }
}

忽略 $fillable/$guarded 并强制查询

如果你创建了一个 Laravel 模板作为其他开发者的「启动器」, 并且你不能控制他们以后会在模型的 $fillable/$guarded 中填写什么,你可以使用 forceFill()

$team->update(['name' => $request->name])

如果 name 不在团队模型的 $fillable 中,怎么办?或者如果根本就没有 $fillable/$guarded, 怎么办?

$team->forceFill(['name' => $request->name])

在删除模型之前执行任何额外的操作

我们可以使用 Model::delete() 执行额外的操作来覆盖原本的删除方法

// App\Models\User.php

public function delete(){

    //执行你想要的额外操作

    //然后进行正常的删除
    Model::delete();
}

如何防止 property of non-object 错误

// 设定默认模型
// 假设你有一篇 Post (帖子) 属于一个 Author (作者),代码如下:
$post->author->name;

// 当然你可以像这样阻止错误:
$post->author->name ?? ''
// 或者
@$post->auhtor->name

// 但你可以在Eloquent关系层面上做到这一点。
// 如果没有作者关联帖子,这种关系将返回一个空的App/Author模型。
public function author() {
    return $this->belongsTo('App\Author')->withDefaults();
}
// 或者
public function author() {
    return $this->belongsTo('App\Author')->withDefault([
        'name' => 'Guest Author'
    ]);
}

关联关系中过滤查询

假如您想加载关联关系的数据,同时需要指定一些限制或者排序的闭包函数。例如,您想获取人口最多的前 3 座城市信息,可以按照如下方式实现:

$countries = Country::with(['cities' => function($query) {
    $query->orderBy('population', 'desc');
    $query->take(3);
}])->get();
上一篇:python 之定时任务(schedule)


下一篇:u-boot (3) —— spl