Почему неопределенная переменная в закрытии laravel?
У меня есть две 3 таблицы: пользователи, профили, friend_request
Переменная$my_profile_id хранит значение идентификатора профиля пользователя
$my_user_id = Auth::user()->id;
$my_profile_id = DB::table('profiles')->select('profiles.profile_id', 'profiles.id')->leftjoin('users','users.id' ,'=' ,'profiles.id')->where('users.id',$my_user_id)->pluck('profiles.profile_id')->first();
$friend_accept = DB::table('friend_request')->select('profiles.profile_id','profiles.first_name','interest_request.sent_at','interest_request.interest_id')->leftjoin('profiles', function($join){
$join->on('interest_request.sender_id' , '=','profiles.profile_id');
$join->orOn('interest_request.to_user_id' , '=','profiles.profile_id');
})->where('to_user_id',$my_profile_id)->orwhere('sender_id',$my_profile_id)->where('interest_status','2')->whereNotIn('profiles.profile_id', function($q)
{
$q->select('profiles.profile_id')->from('profiles')->where('profiles.profile_id',$my_profile_id);
})->groupby('profiles.profile_id')->get();
$my_profile_id
переменная работает нормально в where
а также orwhere
оговорка, но когда я использую в whereNotIn
условие подзапроса создает ошибку: переменная не определена
3 ответа
Ты создаешь closure
но не передал параметр в Closure
так что ваш код не работает
так как внутри замыкания PHP не знает $my_profile_id
переменная вам нужно иметь use
Заявление в закрытии тоже
$my_user_id = Auth::user()->id;
$my_profile_id = DB::table('profiles')->select('profiles.profile_id', 'profiles.id')->leftjoin('users','users.id' ,'=' ,'profiles.id')->where('users.id',$my_user_id)->pluck('profiles.profile_id')->first();
$friend_accept = DB::table('friend_request')->select('profiles.profile_id','profiles.first_name','interest_request.sent_at','interest_request.interest_id')->leftjoin('profiles', function($join){
$join->on('interest_request.sender_id' , '=','profiles.profile_id');
$join->orOn('interest_request.to_user_id' , '=','profiles.profile_id');
})->where('to_user_id',$my_profile_id)
->orwhere('sender_id',$my_profile_id)
->where('interest_status','2')
->whereNotIn('profiles.profile_id', function($q) use ($my_profile_id) {
$q->select('profiles.profile_id')->from('profiles')
->where('profiles.profile_id',$my_profile_id);
})->groupby('profiles.profile_id')->get();
для получения дополнительной информации о Closure
увидеть
Хотя ваш стиль кода немного сложен для чтения, похоже, вы пропустили шаг. Тем не менее, мой предпочтительный стиль кода уже был записан в ответ с, вероятно, рабочим кодом. Не зацикливайтесь на себе и следуйте этому стилю кода.
Ваш код:
whereNotIn('profiles.profile_id', function($q)
{
Отправленный код:
whereNotIn('profiles.profile_id', function($q) use ($my_profile_id) {
Что случилось, вы пропустили полную инструкцию о том, что использовать.
Я думаю, вы не проходите мимо $my_profile_id
переменная внутри замыкания... Вот почему она показывает variable is undefined
$my_user_id = Auth::user()->id;
$my_profile_id = DB::table('profiles')->select('profiles.profile_id', 'profiles.id')->leftjoin('users','users.id' ,'=' ,'profiles.id')->where('users.id',$my_user_id)->pluck('profiles.profile_id')->first();
$friend_accept = DB::table('friend_request')->select('profiles.profile_id','profiles.first_name','interest_request.sent_at','interest_request.interest_id')->leftjoin('profiles', function($join){
$join->on('interest_request.sender_id' , '=','profiles.profile_id');
$join->orOn('interest_request.to_user_id' , '=','profiles.profile_id');
})->where('to_user_id',$my_profile_id)->orwhere('sender_id',$my_profile_id)->where('interest_status','2')->whereNotIn('profiles.profile_id', function($q) use ($my_user_id){ $q->select('profiles.profile_id')->from('profiles')->where('profiles.profile_id',$my_profile_id); })->groupby('profiles.profile_id')->get();
Попробуйте добавить use ($my_user_id)
после function($q)
,