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

#php #laravel

#php #laravel

Вопрос:

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

 id   user_id   favoritable_id   favoritable_type
1       17           1          AppModelsProfileImage
2       10           1          AppModelsPostVideo   this is some other model
 

и таблица profile_images с

 id   user_profile_id   title   path
1         17           etc      etc
 

Мне нужно извлечь все profile_images из таблицы profile_images, которые соответствуют данным в таблице избранного. Таким образом, идентификатор из profile_images соответствует favoritable_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;
}
 

Комментарии:

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

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

3. Каковы отношения между пользователем и избранным — если таковые имеются?

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

Ответ №1:

Вариант 1

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

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

Вариант 2

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

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

    // ...rest of the class code
}
 

Получите результаты с помощью пользовательской модели

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