Laravel объединяющая таблица с возвращением реляционной модели как json - PullRequest
0 голосов
/ 08 марта 2020

У меня есть три таблицы:

  • products таблица (id, name)
  • ingredients таблица (id, ingredient_name)
  • products_ingredients таблица (product_id, ingredient_id)

У меня есть отношение, определенное в Product

public function ingredients(){
    return $this->hasMany('App\ProductIngredient','product_id','id');
}

Когда я перечисляю продукты, используя

$products = Product::where('category_id',$cat->id)->with('ingredients')->get();

Я получаю этот вывод

"products": [{
    "id": 1,
    "name": "Hesp",
    "category_id": 1,
    "ingredients": [{
        "id": 41,
        "product_id": 1,
        "ingredient_id": 4,
    },
    {
        "id": 42,
        "product_id": 1,
        "ingredient_id": 5,
    }]
}]

Что правильно.

Я хочу добавить название ингредиента в список ингредиентов, например,

"products": [{
    "id": 1,
    "name": "Hesp",
    "category_id": 1,
    "ingredients": [{
        "id": 41,
        "product_id": 1,
        "ingredient_id": 4,
        "ingredient_name": "some name" // I want to add this field
    },
    {
        "id": 42,
        "product_id": 1,
        "ingredient_id": 5,
        "ingredient_name": "some name" // I want to add this field 
    }]
}]

Я хочу вернуть это как JSON для использования в API, а не в блейде, где я могу вызывать другие отношения.

Как мне этого добиться?

1 Ответ

0 голосов
/ 09 марта 2020

Вы неправильно применили отношение «многие ко многим». Согласно документации :

Связи "многие ко многим" определяются путем написания метода, который возвращает результат метода ownToMany.

...

Чтобы определить обратное для отношения «многие ко многим», вы делаете еще один вызовзначение ToMany в связанной модели.

class Product extends Model
{
    public function ingredients()
    {
        return $this->belongsToMany('App\Ingredient', 'products_ingredients');
    }
}

class Ingredient extends Model
{
    public function products()
    {
         return $this->belongsToMany('App\Product', 'products_ingredients');
    }
}

Обратите внимание, что связанная модель является первым аргументом belongsToMany(). Не нужно создавать модель для простой сводной таблицы. Поскольку вы неправильно назвали сводную таблицу, она должна быть указана в качестве второго аргумента belongsToMany(). По умолчанию используется имя единственной модели в алфавитном порядке c, т.е. ingredient_product.


Теперь ваш вывод должен выглядеть примерно так, включая значения из таблицы ingredients, а не сводную таблицу .

"products": [{
    "id": 1,
    "name": "Hesp",
    "category_id": 1,
    "ingredients": [{
        "id": 4,
        "ingredient_name": "some name"
    },
    {
        "id": 5,
        "ingredient_name": "some name"
    }]
}]
...