未定义变量'甚至变量是存在的


returns 'undefined variable' even the variable is exist

我正在尝试做一些像自动建议,见下面的代码。

//search suggestion base on the string criteria given
public function search_tag(Request $request){
    $tags = tags::where(function($query){
        foreach(item_tags::where('item_id',$request->item_id)->get() as $i){ //this is the line 192
            $query->orWhere('tag_id','!=',$i->tag_id);
        }
    })->where('tag_name','LIKE','%'.$request->ss.'%')->get();
    return response()->json([ 'success' => true, 'tags' => $tags, 'ss' => $request->ss ]);
}

但是它给了我这个错误

ItemsController.php第192行出错:未定义变量:请求

你可以看到有一个'$request'变量

public function search_tag(Request $request){

但是为什么它告诉我'request'变量是未定义的?有什么想法吗?

闭包中,您使用的是不可用的$request,因此您需要通过use方法传递$request

public function search_tag(Request $request){
    $tags = tags::where(function($query) use ($request) {
        foreach(item_tags::where('item_id',$request->item_id)->get() as $i){ //this is the line 192
            $query->orWhere('tag_id','!=',$i->tag_id);
        }
    })->where('tag_name','LIKE','%'.$request->ss.'%')->get();
    return response()->json([ 'success' => true, 'tags' => $tags, 'ss' => $request->ss ]);
}

$request变量传入闭包:

where(function($query) use ($request) {

闭包也可以从父作用域继承变量。任何这样的变量都必须传递给use语言结构。

http://php.net/manual/en/functions.anonymous.php

这是一个闭包,并且该请求在此范围内未知,请尝试以下操作:

    //search suggestion base on the string criteria given
    public function search_tag(Request $request) use ($request){
        $tags = tags::where(function($query) use {
            foreach(item_tags::where('item_id',$request->item_id)->get() as $i){ //this is the line 192
                $query->orWhere('tag_id','!=',$i->tag_id);
            }
        })->where('tag_name','LIKE','%'.$request->ss.'%')->get();
        return response()->json([ 'success' => true, 'tags' => $tags, 'ss' => $request->ss ]);
}

如果你想在闭包中使用变量,那么你必须在use()内写入。

$tags = tags::where(function($query) use ($request){
    foreach(item_tags::where('item_id',$request->item_id)->get() as $i){ //this is the line 192
        $query->orWhere('tag_id','!=',$i->tag_id);
    }
})->where('tag_name','LIKE','%'.$request->ss.'%')->get();