laravel 的一些小技巧

一、数据表使用 uuid 作为主键,需要注意哪些事情?

可以在 boot 方法中增加生成 uuid 为主键的方法。如果在生成主键之后需要获取 id,那么需要设置 $incrementing = false。具体如下:

<?php
namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Uuid;

class Order extends Model
{

    public $incrementing = false;

    /**
     *  Setup model event hooks
     */
    public static function boot()
    {
        parent::boot();
        self::creating(function ($model) {
            $model->id = (string) Uuid::generate(4);
        });
    }
}

二、路由变量含有“/”,该如何定义路由?

有时候,我们需要在路由中传入复杂的变量,比如一段路径,这个时候可以通过在 routeServiceProvider 中定义一个 pattern 来实现变量被正确的解析。

<?php

namespace App\Providers;

use Illuminate\Support\Facades\Route;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;

class RouteServiceProvider extends ServiceProvider
{

    protected $namespace = 'App\Http\Controllers';

    public function boot()
    {
        //
        Route::pattern('path', '[a-zA-Z0-9-_/.:\?]+');
        parent::boot();
    }

}

这样,比如有以下一张动态剪裁的图片,图片的 path 为:

images/201911/bd484d1ef139b1d7f257d6f96baa3ac2.jpeg

构造的 url 为:

http://inspection.test/image/500x335/90/1/c296c89eb4c0fe68/images/201911/bd484d1ef139b1d7f257d6f96baa3ac2.jpeg

路由就可以这样定义了:

Route::get('/image/{width}x{height}/{quality}/{type}/{signature}/{path}', "ImageController@getImage");

三、联表查询中的 where 语句包含联表字段

在处理联表查询时,如果 where 语句中包含联表字段,需要将联表字段用 DB::raw() 进行包裹。

举个例子:

DB::table('trees')
    ->join('tree_types', 'trees.tree_type', '=', 'tree_types.id')
    ->where('trees.status', 1)
    ->where('trees.pick_count', '<', DB::raw("`tree_types`.`pick_limit`"))
    ->update(['trees.production_status' => 1]);

如果 where('trees.pick_count', '<', DB::raw("`tree_types`.`pick_limit`")) 语句中 直接写
where('trees.pick_count', '<', "tree_types.pick_limit"), 你将无法得到希望的查询结果。

添加新评论