Полиморфные отношения - PullRequest
       8

Полиморфные отношения

0 голосов
/ 03 сентября 2018

У меня есть основная таблица с именем Product со следующими столбцами:

id
product_id
product_type
name
price
in_stock
upc

Где 'id' и 'product_id' являются уникальными (id - это PK)

У меня будут другие таблицы для разных видов продуктов (типов). Все эти другие таблицы будут иметь свойства продукта плюс Другие свойства самостоятельно в зависимости от типа продукта (Т.е. одежда, записи и т. Д.).

Итак, я создал модель продукта, используя полиморфные отношения следующим образом:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;


class Product extends Model
{
    protected $fillable = [
        'product_id',
        'product_type',
        'name',
        'price',
        'in_stock',
        'upc'
    ];

    public function categorizable()
    {
        return $this->morphTo();
    }
}

И, например, модель записей:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Record extends Model
{
    protected $fillable = [
        'artist_id',
        'title',
        'label',
        'code',
        'format',
        'number_of_discs',
        'image',
        'description'
    ];

    public function products()
    {
        return $this->morphMany('\App\Product', 'categorizable');
    }

    public function artist()
    {
        return $this->belongsTo(Artist::class);
    }

    public function track()
    {
        return $this->hasMany(Track::class);
    }

    public function getItemDetails(int $itemId): array {

    }

}

Принимая во внимание, что столбцы для записи:

id
artist_id
product_id
title
label

Это лучший способ связать эти таблицы.

Мои вопросы:

  1. Есть ли лучший подход к этой конкретной проблеме?

  2. В этом случае (используя полиморфные отношения), как мне вставить продукт?

  3. Как я могу запросить товар, чтобы вернуть данные из И таблица продуктов, и таблица рекордов? Я имею в виду, не необработанный запрос Так как это я могу сделать, но как выполнить этот запрос с помощью Красноречивым

1 Ответ

0 голосов
/ 03 сентября 2018

Ваш код идеален, кроме столбца product_id в Record. Вам не нужен этот столбец, просто удалите его

как мне вставить товар?

$product = Product::create([
            'name' => $request->name,
            'price' => $request->price,
            'in_stock' => $request->in_stock
        ]);

$record->products()->save($product);

OR

$record->products()->create([
                'name' => $request->name,
                'price' => $request->price,
                'in_stock' => $request-> in_stock,
                'product_id' => $record->id,
                'product_type' => get_class($record)
            ]);

Если вам нужно создать оба, сделайте это так

$record = Record::create([
          'artist_id' => $request->artist_id
          'title' => $request->title,
          'label' => $request->label,
          'code' => $request->code,
]);

$product = Product::create([
                'name' => $request->name,
                'price' => $request->price,
                'in_stock' => $request->in_stock
            ]);

$record->products()->save($product);

Получить данные

$product = Product::with('categorizable')->find(2);
$product->categorizable; //this will be either Record, Cloth... instance

Аналогично для записи

$record = Record::with('products')->find(1);
$record->products; //it will give you product collection

Подробности вы можете посмотреть https://laravel.com/docs/5.1/eloquent-relationships#polymorphic-relations

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...