2017-10-20 81 views
0

我正在使用Laravel,并且我需要将关联数组传递给雄辩模型中的静态函数。将数组传递给静态方法的雄辩模型

class MyClass extends Eloquent\Model 
{ 
    static function scopeRegister($input) { 
     return $input['key1']; 
    } 
} 

鼓捣运行,这是我输入:

$input = array('key1'=>'value', 'key2'=>'value', 'key3'=> 'value', 'key4'=>'value'); 

当我尝试它,虽然,我得到一个错误:

PHP error: Cannot use object of type Illuminate\Database\Eloquent\Builder as array

当我的类型提示array:

class MyClass extends Eloquent\Model 
{ 
    static function scopeRegister(array $input) { 
     return $input['key1']; 
    } 
} 

我收到以下错误:

Argument 1 passed to App\KeywordGeotarget::scopeRegister() must be of the type array, object given

这里发生了什么,以及如何我可以访问模型中的静态方法数组中定义的值?


编辑:我只是用小炉匠,现在来测试这一点,但这里是我用来调用该方法的代码:

php artisan tinker 
>> $input = array('key1'=>'value','key2'=>'value','key3'=>'value', 'key4'=>'value'); 
>> App\MyClass::register($input); 
+0

你能告诉我们你在哪里(代码)调用静态方法吗? – Yes92

+0

plz添加您调用该函数的代码。 –

+0

感谢您阅读这个问题。我更新了问题并添加了我要调用该函数的代码。 – LeviJames

回答

1

您正在定义一个雄辩范围。范围不适用于数组,而是使用查询。

您可以阅读更多关于如何声明和这里https://laravel.com/docs/5.5/eloquent#local-scopes

使用范围。如果你想调用register()像你这样在补锅匠例如,做到这一点,而不是(只是删除范围):

class MyClass extends Eloquent\Model 
{ 
    static function register(array $input) { 
     return $input['key1']; 
    } 
} 
+0

感谢您的回答!我删除了范围,它的工作。出于某种原因,我想我需要使用范围才能使用静态方法:/由于链接到文档,将其标记为正确的答案。再次感谢! – LeviJames

1

因为它是一个范围,则需要添加一个$query作为第一个参数,然后做这样的事情:

static function scopeRegister($query, array $input) 
{ 
    return $query->where($input['key1']); 
} 

如果你只是想有一个方法,你不想使用它作为一个局部范围,只需重命名的方法(除去scope部分):

static function register(array $input) 
+0

感谢您的回答!我删除了范围,它的工作。出于某种原因,我想我需要使用范围才能使用静态方法:/ – LeviJames

1

您对添加查询范围的理解错误我想您需要阅读我认为的文档。 Check it over here. 范围表示查询构建器属性,并且无法将构建器类属性作为数组获取。你应该像这样使用它。

class MyClass extends Eloquent\Model 
{ 
    public function scopeRegister($query) { 

     return $query->where(// perform your where here); 

    } 
} 
+1

感谢您花时间回答我的问题并显示正确的用法。 – LeviJames