Laravel Relationship Array с целочисленным столбцом - PullRequest
3 голосов
/ 05 ноября 2019

Таблица категорий

enter image description here

Таблица продуктов

enter image description here

Я хочу создать связь с таблицами категорий -> id с таблицей продуктов category_id предложить любую идею для этого отношения Массив с целочисленным отношением столбцов

Контроллер

Products::with('category')->get();

Модель продукта

public function category() {
    return $this->hasMany(App\Models\Categories::class, 'id', 'category_id');
}

Категория Модель

public function product() {
    return $this->belongsTo(Products::class,'category_id', 'id');
}

Ответы [ 2 ]

2 голосов
/ 05 ноября 2019

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

Запуск вашей базы данных должен выглядеть примерно так: enter image description here

Thisкак ваши продукты и категории связаны должным образом, и если вы хотите добавить новую категорию в продукт или наоборот, вы можете просто добавить идентификаторы как категории, так и продукта в таблицу category_product.

Тогдадля ваших методов отношений в вашем Product.php (модель) вы получите этот метод отношений:

/**
 * @return BelongsToMany
 */
public function categories(): BelongsToMany
{
    return $this->belongsToMany(Category::class);
}

А в вашем Category.php (модель):

/**
 * @return BelongsToMany
 */
public function products(): BelongsToMany
{
    return $this->belongsToMany(Product::class);
}

Вы можетеТеперь получите все категории продукта, используя:

$product = Product::first();
$product->categories;

Просто для дополнительной информации. Вы можете использовать свою модель для хранения отношений.

Например, вы хотите добавить к продукту категории 1, 2, 3.

Вы можете просто сделать:

$product = Product::first();
$product->categories()->sync([1, 2, 3]);
0 голосов
/ 05 ноября 2019

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

Products::addSelect(['category' => Category::select('name')
    ->whereIn('id', 'destinations.category_id')
])->get();

Вы должны увидеть, если этодоступно в вашей версии Laravel. https://github.com/laravel/framework/pull/29567

Вы можете добавить в качестве области, если хотите, чтобы она была частью вашей модели.

public function scopeWithCategories($query) 
{
    $query->addSelect(['category' => Category::select('name')
        ->whereIn('id', 'destinations.category_id')
    ]);
}
...