#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();