一、数据表使用 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")
, 你将无法得到希望的查询结果。