我已经为UUID做过特长。我在代码中使用了很多Relationchip。在一段关系中,您可以执行find()
和findOrFail()
,但是我已经为findU()
和findUOrFail()
写了一个代码,但是我不能在关系中使用它。我该如何解决?
特质:
<?php
namespace App\Modules\Base\Traits;
use Ramsey\Uuid\Uuid;
/**
* Trait Uuids
*
* @package Modules\Core\Traits
*/
trait Uuids
{
/**
* Boot function from laravel.
*/
public static function bootUuids ()
{
static::creating(function ($model) {
$model->uuid = Uuid::uuid4()->toString();
});
}
/**
* @param $uuid
*
* @return mixed
*/
public static function findU ($uuid)
{
return static::where('uuid', '=', $uuid)->first();
}
/**
* @param $uuid
*
* @return mixed
*/
public static function findUOrFail($uuid)
{
$post = static::where('uuid', '=', $uuid)->first();
if( is_null($post) ) {
return abort(404);
} else {
return $post;
}
}
}
控制器:
/**
* Show
*/
public function show(Request $request, $uuid)
{
return responder()->success($request->user()->projects()->findUOrFail($uuid))->respond();
}
错误:
Call to undefined method Illuminate\\Database\\Eloquent\\Relations\\BelongsToMany::findUOrFail()
答案 0 :(得分:0)
应该直接在模型中引用该函数,而不是尝试直接在特征中访问它。我假设您在项目模型中包括了上面的Uuids特性。如果是这样,请尝试在项目模型上创建如下方法:
public function tryFindUOrFail($uuid)
{
return $this->findUOrFail($uuid);
}
然后您将显示方法编写为:
return responder()->success($request->user()->projects()->tryFindUOrFail($uuid))->respond();
如果这不起作用,则可能需要将方法包含在$ appends数组中,以便可以通过关系直接访问它。
答案 1 :(得分:0)
假设您不需要id
,因为您正在使用uuid
在您的迁移文件中,您需要:
$table->uuid('uuid');
$table->primary('uuid');
在您的模型中:
use Uuids;
protected $primaryKey = 'uuid';
public $incrementing = false;
或更容易
在您的迁移文件中:
$table->uuid('id');
$table->primary('id');
在您的模型中:
use Uuids;
public $incrementing = false;
您无需覆盖findOrFail
或find