Laravel - 虚拟列 id -> uuid

Laravel - virtual column id -> uuid

我有两个模型:

成分,类别

每种成分都有一个类别id,每个类别有很多成分。

问题是我在内部使用自动增量 ID 进行连接和查询,但只向最终用户显示 UUID。

所以成分 table 看起来像这样:

id uuid 名称category_id

类别 table 如下所示:

id uuid 名称

我的成分数据如下所示:

id: 1,uuid:{a uuid}, name: 成分 A, category_id: 1

当我执行 Ingredient::get() 时,我想 return 这个:

uuid:{成分uuid},名称:成分A,category_uuid:{类别uuid}

根据我所了解的 Laravel,您可以使用访问器和修改器。

我设置了

protected $appends = [
        'category_uuid'
    ];

public function category()
    {
        return $this->belongsTo(Category::class);
    }

    public function getCategoryUuidAttribute()
    {
        return $this->category()->uuid;
    }

但是我得到这个错误:

消息:“未定义 属性:Illuminate\Database\Eloquent\Relations\BelongsTo::$uuid”

我做错了什么?

问题似乎是将 ->first() 添加到方法链中,然后处理了它。

所以变成:

public function getCategoryUuidAttribute()
{
    return $this->category()->first()->uuid;
}

您也可以使用查询生成器实现此目的:

public function index()
{
    $ingredients = DB::table('ingredients')
        ->join('categories', 'ingredients.category_id', 'categories.id')
        ->select('ingredients.*', 'categories.uuid as c_uuid')
        ->get();

    return view('index', compact('ingredients'));
}
@foreach($ingredients as $ingredient)
   <ul>
        <li>{{ $ingredient->uuid }}</li>
        <li>{{ $ingredient->name }}</li>
        <li>{{ $ingredient->c_uuid }}</li>
   </ul>
@endforeach