为什么闭包 laravel 中有未定义的变量?
why undefined variable in closure laravel?
我有两个 3 表:users,profiles, friend_request
$my_profile_id 变量存储用户配置文件 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
子查询子句中使用时它创建错误:变量未定义
你创建了一个 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
的更多信息
我猜你没有在闭包中传递 $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();
尝试在 function($q)
之后添加 use ($my_user_id)
。
虽然你的代码风格有点难读,但看起来你少了一步。但是,我的首选代码风格已经在可能有效的代码回复中列出。不要过分苛求自己并遵循那种代码风格。
您的代码:
whereNotIn('profiles.profile_id', function($q)
{
发布代码:
whereNotIn('profiles.profile_id', function($q) use ($my_profile_id) {
您错过了有关使用方法的完整说明。
我有两个 3 表:users,profiles, friend_request
$my_profile_id 变量存储用户配置文件 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
子查询子句中使用时它创建错误:变量未定义
你创建了一个 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
我猜你没有在闭包中传递 $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();
尝试在 function($q)
之后添加 use ($my_user_id)
。
虽然你的代码风格有点难读,但看起来你少了一步。但是,我的首选代码风格已经在可能有效的代码回复中列出。不要过分苛求自己并遵循那种代码风格。
您的代码:
whereNotIn('profiles.profile_id', function($q)
{
发布代码:
whereNotIn('profiles.profile_id', function($q) use ($my_profile_id) {
您错过了有关使用方法的完整说明。