#php #laravel #eloquent #laravel-relations
Вопрос:
Я хотел бы знать, как передать переменную внутри with
функции. Код выглядит следующим образом:
Здесь у нас есть код контроллера:
$id = 2;
$user = User::where('userToken', '=', $token)
->with('userPost($id)')
->first();
И вот у нас есть код модели:
public function userPost($id) {
return $this->hasMany(PostPhotos::class, 'user_id', 'id')
->with(['getlikes' => function($q) use ($id) {
$q->where('likeStatus', '=', 'like');
$q->where('userclick_id', '=', $id);
}]);
}
Не могли бы вы, пожалуйста, помочь мне в этом?
Комментарии:
1. попробуйте сначала изменить отношение, как показано ниже, публичная функция UserPost(){ возвращает $this->hasMany(PostPhotos::класс,’идентификатор пользователя’,’идентификатор’); } Затем в запросе $user = User::where(‘userToken’,’=’,$token)->>with([‘userPost’,’userPost.getlikes’])->>>whereHas(‘userPost.getlikes’,function($query)используйте ($id){ $q->>>>где(‘likeStatus’, ‘=’, ‘нравится’); $q->>>>>где(‘userclick_id’, ‘=’, $id); })->>>>>>первый(); это
2. отношения не зависят от конкретного экземпляра (без определенного идентификатора), поэтому вам не следует привязывать их к одному экземпляру. Найдите другое решение. Может быть, объяснить подробнее все отношения на работе здесь и результат, которого вы ожидаете ?
Ответ №1:
Ваша логика ложна. Потому with
что функция используется для отображения отношений. В модели вы должны показывать только отношения как belongsTo
или oneToMany
. Но вы можете достичь своей цели с помощью прицелов. Просто вам нужно провести исследование отсюда: https://laravel.com/docs/8.x/eloquent#query-scopes