Карта морфинга Laravel не работает с расширенными моделями

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

Вот как я настроил свою морф-карту:

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

Relation::morphMap([
    'coupon' => Product::class,
    'offer' => Product::class,
]);

 public function scopefilter($query)
    {
        return $query->where(function ($query) {
            // Include sliders with active morph relationships
            $query->whereHasMorph('model','*', function ($query, $type) {
                if (in_array($type,[ Blog::class, Coupon::class, Offer::class])) {
                    $query->active();
                }
            })->orWhereNull('model_type');  // Or include sliders without any morph
        });
    }

Расширенные модели Coupon, Offer и все они наследуются от модели Product.

Проблема, с которой я столкнулся, заключается в том, что когда я пытаюсь получить связанную модель слайдера с помощью $slider->model, он возвращает экземпляр только в том случае, если это продукт, но не в том случае, если это купон, предложение, . Однако, когда я меняю порядок карты морфинга, работает только первый на карте, а остальные игнорируются.

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
0
179
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если у вас есть подклассы для Coupon и Offer, используйте их в карте морфинга. Если они оба укажут класс Product, Laravel создаст экземпляр объекта Product.

Изменять

Relation::morphMap([
    'coupon' => Product::class,
    'offer' => Product::class,
]);

к

Relation::morphMap([
    'coupon' => Coupon::class,
    'offer' => Offer::class,
]);

В результате быстрого поиска я нашел этот старый, но полезный пост, в котором говорится, что вам необходимо переопределить функцию getMorphClass в ваших классах, наследующих от Product. Например:

class Coupon extends Product
{
    public function getMorphClass()
    {
        return 'coupon';
    }
}

не работает, просто намекните, что модель класса купона Купон расширяет продукт

Kareimovich 01.05.2024 00:40

я попробовал ```` Relation::morphMap([ Coupon::class => Product::class, Offer::class => Product::class, ]); ````работает только по купону, и если я сделаю предложение выше купона, предложение не вернет купон

Kareimovich 01.05.2024 00:40

@Kareimovich Я нашел дополнительную информацию об использовании наследования и полиморфных отношений. Попробуйте это

Tony 01.05.2024 00:49

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

Kareimovich 01.05.2024 00:53

Какое имя указано в поле таблицы базы данных *_type? Соответствует ли оно названию морф-карты «купон»? Альтернатива — вернуть полное имя класса в функции getMorphClass и не использовать массив morphMap.

Tony 01.05.2024 00:56

я получил то же имя от БД и сработал, ты спас мне жизнь, спасибо

Kareimovich 01.05.2024 01:02

Еще раз спасибо, я очень признателен

Kareimovich 01.05.2024 01:03

Другие вопросы по теме