Laravel - идентификатор виртуального столбца -> uuid - PullRequest
0 голосов
/ 10 июля 2020

У меня две модели:

Ингредиент, Категория

Каждый ингредиент имеет идентификатор категории, в каждой категории много ингредиентов.

Проблема в том, что я использую авто- увеличивать идентификаторы для соединений и запросов внутри, но показывать только UUID для конечных пользователей.

Итак, таблица ингредиентов выглядит так:

id uuid name category_id

И таблица категорий выглядит так:

id uuid name

Мои данные в ингредиентах выглядят так:

id: 1, uuid: {a uuid}, name: Ingredient A, category_id : 1

Когда я выполняю Ingredient :: get (), я хочу вернуть это:

uuid: {ингредиент uuid}, name: Ingredient 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»

Wha я что делаю не так?

Ответы [ 2 ]

0 голосов
/ 10 июля 2020

Этого также можно добиться с помощью построителя запросов:

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
0 голосов
/ 10 июля 2020

Похоже, проблема заключалась в добавлении -> first () в цепочку методов, и это решило ее.

Таким образом, получается:

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