почему неопределенная переменная в закрытии laravel? - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть две таблицы: пользователи, профили, 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 ]

0 голосов
/ 14 ноября 2018

Я полагаю, вы не передаете $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).

0 голосов
/ 14 ноября 2018

Хотя ваш стиль кода немного сложен для чтения, похоже, вы пропустили шаг. Тем не менее, мой предпочтительный стиль кода уже был записан в ответ с, вероятно, рабочим кодом. Не зацикливайтесь на себе и следуйте этому стилю кода.

Ваш код:

whereNotIn('profiles.profile_id', function($q)
{

Отправленный код:

whereNotIn('profiles.profile_id', function($q) use ($my_profile_id) {

То, что произошло, вы пропустили полную инструкцию о том, что использовать.

0 голосов
/ 14 ноября 2018

вы создали 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 см.

...