Как изменить результат отношения laravel - PullRequest
1 голос
/ 18 апреля 2020

У меня есть отношение один к одному в laravel, такое же как следующее:

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

, и я выполняю этот красноречивый запрос:

Product::with('category')->first();

этот запрос возвращает:

{
    "name": "Green Book",
    "category": {
        "id": 1,
        "name": "Book"
    }
}

но я пошел эти данные:

{
    "name": "Green Book",
    "category": "Book"
}

Возможно ли это сделать без использования al oop?

Ответы [ 3 ]

2 голосов
/ 18 апреля 2020

Прежде всего кажется, что у вас есть 1-X отношение, которое вы ошибочно используете как многие к одному. Ваш belongsTo должен быть hasOne, поскольку ваши элементы имеют одну категорию, а не наоборот.

Вы можете использовать свойство $appends, чтобы добавить настраиваемое поле и заставить его вести себя так, как если бы оно было частью ваша модель:

Переименуйте ваши отношения и добавьте мутатор и аксессор:

public function categoryRelationship()
{
    return $this->hasOne(Categories::class);
}

public function getCategoryAttribute() {
    return $this->categoryRelationship->name;
}

public function setCategoryAttribute($value) {
   $this->categoryRelationship->name = $value;
}

Вы также можете добавить событие, чтобы автоматически сохранять ваши отношения при сохранении модели, чтобы гарантировать ее работает прозрачно:

protected static function booted()
    {
        static::saving(function ($myModel) {
            $myModel->categoryRelationship->save();
        });
    }
}

Наконец, вы добавляете свойство $appends, чтобы убедиться, что ваш новый атрибут всегда включен в модель, как если бы он был собственным.

protected $appends = [ 'category' ];

// This is so you don't end up also showing the relationship
protected $hidden = [ 'categoryRelationship' ];
0 голосов
/ 18 апреля 2020

Вы можете использовать leftJoin

return \App\Product::leftJoin('categories', 'products.category_id', '=', 'categories.id')
->select('products.*', 'categories.title as category')->get();
0 голосов
/ 18 апреля 2020

В соответствии с Laravel Do c Eager Loading Specifi c Столбцы

Вы можете использовать следующие

Product::with('category:id,name')->first();

Или вы можете сделать это себя:

$product = Product::with('category')->first();
$product->category = $product->category->name;
...