Laravel 拉维关系查找UUID

Laravel 拉维关系查找UUID,laravel,relationship,uuid,Laravel,Relationship,Uuid,我对UUID有一个特点。我在代码中使用了很多relationschip。在关系上,您可以执行find()和findOrFail()但我已经为findU()和findUOrFail()编写了代码,但我不能在关系中使用它。我怎样才能修好它 特点: <?php namespace App\Modules\Base\Traits; use Ramsey\Uuid\Uuid; /** * Trait Uuids * * @package Modules\Core\Traits */ t

我对UUID有一个特点。我在代码中使用了很多relationschip。在关系上,您可以执行
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;
        }
    }

}
错误:
调用undefined method Illumb\\Database\\Eloquent\\Relations\\BelongToMany::findUOrFail()

让函数直接在模型中引用,而不是试图在特征中直接访问它,应该会有所帮助。我假设您在项目模型中包含上述UUID特性。如果是,请尝试在项目模型上创建如下方法:

public function tryFindUOrFail($uuid)
{
    return $this->findUOrFail($uuid);
}
然后,您可以将show方法编写为:

return responder()->success($request->user()->projects()->tryFindUOrFail($uuid))->respond();

如果这不起作用,您可能需要在$appends数组中包含您的方法,以便可以通过关系直接访问它。

让函数在模型中直接引用,而不是试图在trait中直接访问它,这应该会有所帮助。我假设您在项目模型中包含上述UUID特性。如果是,请尝试在项目模型上创建如下方法:

public function tryFindUOrFail($uuid)
{
    return $this->findUOrFail($uuid);
}
然后,您可以将show方法编写为:

return responder()->success($request->user()->projects()->tryFindUOrFail($uuid))->respond();

如果这不起作用,您可能需要在$appends数组中包含您的方法,以便可以通过关系直接访问它。

假设您不需要
id
,因为您使用的是
uuid

在迁移文件中,您需要:

$table->uuid('uuid');
$table->primary('uuid');
在您的模型中:

use Uuids;
protected $primaryKey = 'uuid';
public $incrementing = false;
use Uuids;
public $incrementing = false;
或更简单

在迁移文件中:

$table->uuid('id');
$table->primary('id');
在您的模型中:

use Uuids;
protected $primaryKey = 'uuid';
public $incrementing = false;
use Uuids;
public $incrementing = false;

您不需要重写
findOrFail
find

假设您不需要
id
,因为您正在使用
uuid

在迁移文件中,您需要:

$table->uuid('uuid');
$table->primary('uuid');
在您的模型中:

use Uuids;
protected $primaryKey = 'uuid';
public $incrementing = false;
use Uuids;
public $incrementing = false;
或更简单

在迁移文件中:

$table->uuid('id');
$table->primary('id');
在您的模型中:

use Uuids;
protected $primaryKey = 'uuid';
public $incrementing = false;
use Uuids;
public $incrementing = false;

您不需要覆盖
findOrFail
find

为什么不使用名称
id
作为标识符?是否需要
id
?否则,可以将primarykey设置为
uuid
如果设置$table->uuid('id')->primary(),会更容易;在迁移文件中,您可以使用find()方法查找指定的模型。为什么不使用名称
id
作为标识符?是否需要
id
?否则,可以将primarykey设置为
uuid
如果设置$table->uuid('id')->primary(),会更容易;在迁移文件中,可以使用find()方法查找指定的模型