Laravel关系查找UUID

时间:2018-12-11 15:18:25

标签: laravel relationship uuid

我已经为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()

2 个答案:

答案 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;

您无需覆盖findOrFailfind