Проблема с получением данных из базы данных в полиморфных отношениях «один ко многим» в Laravel

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

id   user_id   favoritable_id   favoritable_type
1       17           1          App\Models\ProfileImage
2       10           1          App\Models\PostVideo   this is some other model

и таблица profile_images с

id   user_profile_id   title   path
1         17           etc      etc

Мне нужно получить все изображения profile_images из таблицы profile_images, которые соответствуют данным в таблице избранного. Таким образом, id из profile_images должен совпадать с Favorite_id, user_profile_id совпадать с user_id и Favoritable_type совпадать с App\Models\ProfileImage из таблицы избранного. Любая помощь приветствуется. Вот мой код.

Контроллер

public function getProfileImages()
{
    $profileimage = ProfileImage::whereColumn('id', 'favoritable_id')->first();
    // I AM BASICALLY STUCK HERE WITH $profileimage !!!

    $favoriteProfileImages = $profileimage->favorites()->where([
            'user_id' => auth()->id(),
            'favoritable_id' => $profileimage->id,
            'favoritable_type' => ProfileImage::class
        ])->get();

    return $favoriteProfileImages;
}

Не совсем понял, чего ты хочешь. Вы хотите получить все записи ProfileImage, которые были добавлены в избранное, т.е. иметь записи в таблице избранного. Или вы хотите получить все записи из таблицы избранного, которые связаны с вошедшим в систему пользователем.

Donkarnash 18.12.2020 03:35

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

rose 18.12.2020 08:55

Какова связь между пользователем и избранным - если есть?

Donkarnash 18.12.2020 08:56

@Donkarnash В модели Favorite у меня есть публичная функция user(){return $this->belongsTo(User::class);} с user_id в таблице избранного.

rose 18.12.2020 09:07
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать 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 и хотите разрабатывать...
2
4
148
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Опция 1

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

$profileImages = Favorite::where('user_id', auth()->id())
    ->with([
        'favoritable' => fn($query) => $query->where('favoritable_type', ProfileImage::class)
    ])
    ->get()
    ->pluck('favoritable')
    ->flatten()
    ->all();

Вариант 2

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

class User extends Model
{
    public function favorites()
    {
        return $this->hasMany(Favorite::class);
    }

    // ...rest of the class code
}

Получите результаты через модель User

$profileImages = User::with([
    'favorites' => 
        fn($query) => $query->where('favoritable_type', ProfileImage::class)->with('favoritable')
    ])
    ->where('id', auth()->id())
    ->first()
    ->favorites
    ->pluck('favoritable')
    ->flatten()
    ->all();

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