У меня есть полиморфные отношения «один ко многим» в 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;
}
@Donkarnash Мне нужны изображения профиля, у которых есть запись в таблице избранного для текущего пользователя, вошедшего в систему.
Какова связь между пользователем и избранным - если есть?
@Donkarnash В модели Favorite у меня есть публичная функция user(){return $this->belongsTo(User::class);} с user_id в таблице избранного.
Опция 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();
Не совсем понял, чего ты хочешь. Вы хотите получить все записи ProfileImage, которые были добавлены в избранное, т.е. иметь записи в таблице избранного. Или вы хотите получить все записи из таблицы избранного, которые связаны с вошедшим в систему пользователем.