Polymorphi c OneToMany отношения изображений-продуктов, как узнать, какие изображения какие? - PullRequest
1 голос
/ 13 февраля 2020

Для личного проекта я пытаюсь создать интернет-магазин, используя laravel. У меня есть таблица продуктов и таблица изображений, которые имеют отношение Один ко многим Polymorphi c. Некоторые продукты отличаются друг от друга и могут нуждаться только в одном изображении, а другие должны иметь несколько изображений. Я изо всех сил пытаюсь найти способ узнать, какой образ какой. Например, одно изображение может быть миниатюрой товара, другое - изображением части товара, например, c. Должен ли я создать новую таблицу image_types и сохранить идентификатор в моей таблице изображений, или это не эффективно?

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

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateProductsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('products', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name');
            $table->text('description')->nullable();
            $table->decimal('stock', 8, 2)->nullable();
            $table->decimal('price', 8, 2)->nullable();
            $table->unsignedBigInteger('product_category_id');
            $table->foreign('product_category_id')->references('id')->on('product_categories')->onDelete('cascade');
            $table->unsignedBigInteger('account_type_id');
            $table->foreign('account_type_id')->references('id')->on('account_types')->onDelete('cascade');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('products');
    }
}

Таблица изображений

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateImagesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('images', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('url');
            $table->morphs('imageable');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('images');
    }
}

Ответы [ 2 ]

0 голосов
/ 14 февраля 2020

для сохранения нескольких изображений для продукта, для которого вы сохраняете URL-адреса изображений в столбце в виде строки массива, для этой цели необходимо преобразовать столбец URL-адреса в модели изображений следующим образом:

protected $casts = [
    'url' => 'array' // when set the url it convert to string and when get data it convert to array
];

затем, когда вы хотите чтобы сохранить URL-адреса изображений, задайте ключ для любого типа изображения, например, для задания миниатюры, а исходное изображение выполните следующие действия:

$urlArray = [];
$urlArray['thumbnail'] = $thumbnailUrl;
$urlArray['original'] = $originalUrl;

. Это простой пример. Таким способом можно установить ключ для любого типа изображение, даже если вы хотите сохранить несколько размеров для миниатюрного изображения, вы можете сделать следующее:

$urlArray['thumbnail']['240'] = $thumbnailUrlLow; // or set key ['thumbnailLow']
$urlArray['thumbnail']['320'] = $thumbnailUrlMed;
$urlArray['thumbnail']['480'] = $thumbnailUrlHigh;

для получения миниатюр URL-адреса продукта выполните следующие действия:

$image->url['thumbnail']['320']

для получения оригинального iamge size:

$iamge->url['original'];

Вы можете установить много ключей, сделать многое с помощью набора ключей для любого типа изображения продукта.

не забудьте определить protected $casts для целевого столбца и установить конвертирование в массив, когда его получить.

0 голосов
/ 13 февраля 2020
# images migration file
public function up()
{
    Schema::create('images', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->unsignedBigInteger('product_id');
        $table->string('url');
        // Maybe add the following column if you really need to be able
        // to tell the difference between what is and isn't a thumbnail.
        // $table->enum('type', ['thumbnail', 'other']);

        $table->foreign('product_id')->references('id')->on('products');
    });
}
# Image model
class Image extends Model
{
    public function product()
    {
        // an Image belongs to a Product, using the foreign key 'product_id'
        return $this->belongsTo(Product::class, 'product_id');
    }
}
# Product model
class Product extends Model
{
    public function images()
    {
        // a Product has one or many images (Image), using the foreign key 'product_id'
        return $this->hasMany(Image::class, 'product_id');
    }
}
$product = Product::find($product_id);
// get a collection of all the Product's images
$product->images
$image = Image::find($image_id);
// get THE product this image belongs to
$image->product

Подробнее:

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