Laravel Polymorphic отношение многие ко многим - PullRequest
0 голосов
/ 03 декабря 2018

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

У меня есть ряд продуктов.Каждый из этих продуктов может быть помечен на одну или несколько категорий, брендов и потребителей.Например:

enter image description here

Я рассчитывал с этой настройкой, мне понадобится таблица для моих полиморфных отношений, как показано ниже:

enter image description here

Я создал новый класс Taggable, который содержит следующие

<?php

    namespace App\Models;

    use Illuminate\Database\Eloquent\Model;

    class Taggable extends Model
    {
        public function taggable()
        {
            return $this->morphTo();
        }
    }

... и добавил метод в мой класс Product:

public function taggedCategories()
{
    return $this->morphMany(Taggable::class, 'taggable');
} 

Наконец, в моем ProductController я пытаюсь получить все продукты с их отношениями следующим образом:

$products = Product::with('taggedCategories')

Хотя это не приводит к ошибке, в моих результатах не возвращаются категории.Глядя на вывод SQL в LaravelDebugBar, я вижу следующий SQL.

select * from `taggables` where `taggables`.`taggable_id` in (1) and `taggables`.`taggable_type` = 'App\Models\Product'

Это явно не правильно, но я не могу ни ради любви, ни за деньги выяснить, где я ошибся.Я чувствую, что я рядом, но не совсем там.

Может кто-нибудь объяснить, что не так?Кроме того, нужно ли мне делать что-то другое для получения «Бренда», так как это отношения один ко многим, а не многие ко многим?

Спасибо

1 Ответ

0 голосов
/ 03 декабря 2018

Структура вашей модели будет выглядеть следующим образом:

class Categories extends Model
{        
    public function products()
    {
        return $this->morphToMany('App\Tag', 'productable');
    }
}

class Brand extends Model
{        
    public function products()
    {
        return $this->morphToMany('App\Tag', 'productable');
    }
}

// and Consumers, ....

Модель пользователя:

class Product extends Model
{        
    public function categories()
    {
        return $this->morphedByMany('App\Categories', 'productable');
    }

    public function brands()
    {
        return $this->morphedByMany('App\Brunds', 'productable');
    }
}

Схема базы данных:

categories
    id - integer
    ...

brands
    id - integer
    ...

consumer
    id - integer
    ...

productable
    product_id - integer
    productable_id - integer
    productable_type - string

Теперь вы можете получитьотношения:

$categories = App\Categories::find(1);
// retrieve product of a type
foreach ($categories->products as $product) {
    //
}

$product = App\Product::find(1);
// retrieve categories  of a product
foreach ($product->categories as $categories) {
    //
}

На самом деле, ваш тип продукта (категории, бренды, потребители) являются товарными.

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